sed将.txt中的文本移动到下一行

时间:2012-02-13 12:10:00

标签: windows unix csv sed cygwin

我正在尝试解析出如下所示的文本文件:

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

我希望看到的是数据堆叠

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

等等。如果有的话,在每个逗号后我都希望下面的文本转到新的txt行。关于最后一行表示从前进日期的最后一行,我希望将其放在txt文件中,如

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

我在Windows XP机器上使用cygwin。提前感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

将最后一行放入单独的文件中:

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

其余的:

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

对于第二个命令中的第一个'\ n',您的里程可能会有所不同。它如果不能正常使用空格替换它(假设您的数据没有空格)。

或者,如果您愿意,可以使用shell脚本对文件进行操作并将其拆分:

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

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

cat "$1" | sed -r 's/,Fromdate[^\n]+//' | sed 's/,/\n/' | sed -r 's/$/\n\n' > "$1_fixed.txt"

只需将其粘贴到文件中即可运行。我使用Cygwin已经好几年了......你可能要先chmod +x file

答案 1 :(得分:1)

我根据你想要的文件提供两个答案。上一个答案将其分成两个文件,这个文件将其全部保存在一个文件中,格式为:

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.

这是我能用分界符做的最好的事情。如果你已经离开了“EMPIRE STATE BUILDING CO,494202320000008,336 5 AVE ENT,纽约,纽约”这样的话会更容易。

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

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

再次,只需将其粘贴到文件中并从Cygwin运行它:./filename.sh