【问题标题】:Convert multi-line file into TSV using awk使用 awk 将多行文件转换为 TSV
【发布时间】:2012-01-07 21:38:45
【问题描述】:

我正在使用 Windows 7 和 gawk 3.1.3(通过 UnxUtils)。

我想打开这个输入(利物浦足球俱乐部的赛程):

Sunday, 27 November 2011
Barclays Premier League
Liverpool v Man City, 16:00
Tuesday, 29 November 2011
Carling Cup
Chelsea v Liverpool, QF, 19:45
...

到一个制表符分隔的文件中,例如:

Sunday, 27 November 2011<tab>Barclays Premier League<tab>Liverpool v Man City, 16:00
Tuesday, 29 November 2011<tab>Carling Cup<tab>Chelsea v Liverpool, QF, 19:45
...

我试过用 awk 来做这件事,但到目前为止都失败了。识别第一行和第二行很容易:

if (NR % 3 == 1 || NR % 3 == 2) print;

但尽管进行了多次尝试(通常会导致语法错误),但仍无法找出如何去除 (Windows) 行尾并将它们与每三行连接一次。

我现在想知道 awk 是否真的是适合这项工作的工具。

感谢任何指点。

【问题讨论】:

    标签: windows string text awk


    【解决方案1】:
    awk '(NR % 3) > 0 {printf("%s\t",$0)}
         (Nr % 3) == 0 {printf("%s\n",$0)}
    

    应该可以。对于 NR(记录数)的模数不为 0 的每一行,它将打印该行和一个 tab 字符。否则(输入)行和换行符。

    HTH

    【讨论】:

    • 完美,谢谢!我在玩 sub() 却一无所获。
    【解决方案2】:

    请看下面的测试:

    kent$  echo "Sunday, 27 November 2011
    Barclays Premier League
    Liverpool v Man City, 16:00
    Tuesday, 29 November 2011
    Carling Cup
    Chelsea v Liverpool, QF, 19:45
    "|awk '{printf $0"\t";if(!(NR%3))print""}'
    

    输出:

    Sunday, 27 November 2011        Barclays Premier League Liverpool v Man City, 16:00
    Tuesday, 29 November 2011       Carling Cup     Chelsea v Liverpool, QF, 19:45
    

    【讨论】:

    • (在我的 Windows 7 PC 上)在每一行的末尾留下一个额外的标签,但它也可以完成这项工作。也谢谢你。
    猜你喜欢
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    相关资源
    最近更新 更多