windows - sed flyt tekst i .txt til næste linje

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at uddele en tekstfil, der ligner følgende:


EMPIRE,STATE,BLDG,CO,494202320000008,336,5,AVE,ENT,NEW,YORK,NY,10003,N,3/1/2012,TensionCode,VariableICAP,PFJICAP,Residential,\%LBMPZone,L,9,146.0,,,10715.0956,,,--,,0,,,J,TripNumber,ServiceClass,PreviousAccountNumber,MinMonthlyDemand,TODCode,Profile,Tax,Muni,41,39,00000000000000,9952,54,Y,Non-Taxable,--,FromDate,ToDate,Use,Demand,BillAmt,12/29/2011,1/31/2012,4122520,6,936.00,$293,237.54


Det jeg gerne vil se er de data, der er stablet


- EMPIRE STATE BLDG CO
- 494202320000008
- 336 5 AVE ENT
- NEW YORK NY


og så videre. Hvis noget, efter hvert komma vil jeg gerne have teksten til at gå til en ny txt-linje. I sidste ende med hensyn til den sidste linje, hvor det hedder dato fra fremad, vil jeg gerne have det i en txt-fil som


- From Date  ToDate    use     Demand   BillAmt
- 12/29/2011 1/31/2012 4122520 6,936.00 $293,237.54.


Jeg bruger cygwin på en Windows XP-maskine. Tak på forhånd for enhver hjælp.

Bedste reference


For at få den sidste linje til en separat fil:


echo -e "From Date	ToDate	use	Demand	BillAmt" > lastlinefile.txt
cat originalfile.txt | sed 's/,FromDate/~Fromdate/' | awk -v FS="~" '{print $2}' | sed 's/FromDate,ToDate,use,Demand,BillAmt,//' | sed 's/,/	/' >> lastlinefile.txt


For resten:


cat originalfile.txt | sed -r 's/,Fromdate[^
]+//' | sed 's/,/
/' | sed -r 's/$/

' > nocommas.txt


Din kilometertal kan variere så langt som den første '\ n' er bekymret i den anden kommando. Hvis det ikke virker, skal det erstattes med et mellemrum (forudsat at dine data ikke har mellemrum).


Eller, hvis du vil, et skal script til at operere på en fil og opdele det:


#!/bin/bash
if [ -z "$1" ]
then echo "Usage: $0 filename.txt; exit; fi

echo -e "From Date	ToDate	use	Demand	BillAmt" > "$1\_lastline.txt"
cat "$1" | sed 's/,FromDate/~Fromdate/' | awk -v FS="~" '{print $2}' | sed 's/FromDate,ToDate,use,Demand,BillAmt,//' | sed 's/,/	/' >> "$1\_lastline.txt"

cat "$1" | sed -r 's/,Fromdate[^
]+//' | sed 's/,/
/' | sed -r 's/$/

' > "$1\_fixed.txt"


Du skal blot indsætte det i en fil og køre den. Det har været år siden jeg brugte Cygwin ... du må måske først [[.

Andre referencer 1


Jeg giver dig to svar afhængigt af, hvordan du ønskede filen. Det foregående svar splittede det i to filer, det ene holder det hele i en fil i formatet:


EMPIRE
STATE
BLDG
CO
494202320000008
336
5
AVE
ENT
NEW
YORK
NY
From Date  ToDate    use     Demand   BillAmt
12/29/2011 1/31/2012 4122520 6,936.00 $293,237.54.


Det er det bedste, jeg kan gøre med afgrænsningselementerne, har du sat på plads. Hvis du har lået det noget, så er det 'EMPIRE STATE BUILDING CO, 494202320000008,336 5 AVE ENT, NEW YORK, NY' det 'd være meget nemmere.


#!/bin/bash
if [ -z "$1" ]
then echo "Usage: $0 filename.txt; exit; fi

cat "$1" | sed 's/,FromDate/~Fromdate/' | awk -v FS="~" '{gsub(",","
",$1);print $1;print "FromDate	ToDate	use	Demand	BillAmt";gsub("FromDate,ToDate,use,Demand,BillAmt","",$2);gsub(",","	",$2);print $2}' >> "$1\_fixed.txt" 


igen, skal du bare indsætte det i en fil og køre den fra Cygwin: ./filename.sh