【问题标题】:sed move text in .txt to next linesed 将 .txt 中的文本移动到下一行
【发布时间】:2012-03-04 20:11:27
【问题描述】:

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

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。提前感谢您的任何帮助。

【问题讨论】:

  • 这是一个数据库转储文件吗?也许你应该使用SQL

标签: windows unix csv sed cygwin


【解决方案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,NEW YORK,NY”之类的内容,会容易得多。

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

【讨论】:

    【解决方案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 它。

    【讨论】:

    • 我知道这也可以用 sed 脚本来完成,但我从来没有处理过。我的大部分 sed 用法都在链式 shell 命令中(你不知道),所以这就是我给你的
    • 非常感谢您的帮助,我将继续努力并跟进。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-23
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    相关资源
    最近更新 更多