2012-02-13 68 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