2012-02-13 69 views
0

我试图解析出一个文本文件,如下所示:SED将文字移至下一行

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行。 Ultimatly在问候它规定日期从正向的最后一行,我想有它在一个txt文件一样

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

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

+0

这是一个数据库转储文件?也许你应该使用'SQL'。 – kev 2012-02-13 12:17:56

回答

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

+0

我知道这也可以用sed脚本完成,但我从来没有处理过。我的绝大多数sed用法都是在链接shell命令中(难道你不知道),所以这就是我给你的 – 2012-02-13 12:25:24

+0

非常感谢你的帮助,我将与此合作并跟进。 – 2012-02-13 13:15:50

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. 

这是我可以用分隔符中有你的地方设置做到最好。如果你想让它像“纽约州纽约市AVE ENT的EMPIRE STATE BUILDING CO,494202320000008,336”那样就会容易得多。

#!/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