【问题标题】:Using awk to conditionally join lines使用 awk 有条件地连接行
【发布时间】:2014-11-22 21:41:27
【问题描述】:

我有一个文件,我们称之为 test.txt,格式如下:

1|2|3|4| 1|2|3|4| 1|2| 3|4| 1|2|3|4| 1|2|3|4|

您将看到第三行已被分成两行,我需要能够处理该文件,以便重新连接所有此类事件以导致:

1|2|3|4| 1|2|3|4| 1|2|3|4| 1|2|3|4| 1|2|3|4|

我一直试图通过首先获取每行上的管道数量来实现这一点:

cat test.txt | awk -F'|' '{print NF -1}

我想要做的是扩展它,以便任何不匹配指定管道数(在本例中为四个管道)的行连接到下一行,直到它们匹配为止。

谁能指出我正确的方向?谢谢。

【问题讨论】:

    标签: bash file unix awk


    【解决方案1】:

    你可以稍微玩一下字段的数量:

    awk -v FS="|" '{printf "%s%s", $0, (f+NF<5?"":RS); f+=NF} f>=5 {f=0}' file
    

    这会将字段分隔符设置为|,并从中不断计算到目前为止已打印了多少字段。如果数量小于5,则保持在同一行打印;否则,打印一个新行。

    测试

    对于像这样的输入文件

    $ cat a
    1|2|3|4|
    1|2|3|4|
    1|2|
    3|4|
    7|2|3|4|
    1|2|3|4|
    1|
    2|
    3|4|
    

    查看输出:

    $ awk -v FS="|" '{printf "%s%s", $0, (f+NF<5?"":RS); f+=NF} f>=5 {f=0}' a
    1|2|3|4|
    1|2|3|4|
    1|2|3|4|
    7|2|3|4|
    1|2|3|4|
    1|2|3|4|
    

    【讨论】:

      猜你喜欢
      • 2021-04-08
      • 2011-10-27
      • 1970-01-01
      • 1970-01-01
      • 2020-12-30
      • 1970-01-01
      • 2018-07-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多