【问题标题】:all pairs of consecutive lines sharing a field, using awk使用 awk 共享一个字段的所有连续行对
【发布时间】:2015-11-05 07:38:33
【问题描述】:

我想处理一个多行、多字段的输入文件,以便我得到一个包含所有连续行对的文件,前提是它们与字段 #1 具有相同的值。

也就是说,对于每一行,输出将包含该行本身 + 下一行,并且会省略字段 #1 中具有不同值的行组合。

最好用一个例子来解释。

鉴于此输入:

1 this
1 that
1 nye
2 more
2 sit

我想制作类似的东西:

1 this 1 that
1 that 1 nye
2 more 2 sit

到目前为止,我得到了这个:

awk 'NR % 2 == 1 { i=$0 ; next } { print i,$0 } END { if ( NR % 2 == 1 ) { print i } }' input.txt

我的输出:

1 this 1 that
1 nye 2 more
2 sit

如您所见,我的代码对字段 #1 的值视而不见,而且(更重要的是)它省略了像 1 that 1 nye 这样的“中间”结果(一旦用一行完成,它就会跳转到下一对行)。

有什么想法吗?我的首选语言是 awk/gawk,但如果可以使用 unix bash 完成,也可以。

提前致谢!

【问题讨论】:

    标签: bash awk gawk


    【解决方案1】:

    只是为了好玩

    paste -d" " filename <(sed 1d filename) | awk '$1==$3'
    

    【讨论】:

      【解决方案2】:

      你可以使用这个 awk:

      awk 'NR>1 && ($1 in a){print a[$1], $0} {a[$1]=$0}' file
      1 this 1 that
      1 that 1 nye
      2 more 2 sit
      

      【讨论】:

      • 不错!我发现我离答案还很远。非常感谢!
      • 你能解释一下最后一个{}块的含义吗?
      • 为什么是 print a[$1] OFS $0print a[$1], $0
      • 是的,确实应该是 print a[$1], $0 以获得更短的代码。 @XGrau:最后一个{a[$1]=$0} 正在填充数组a,键为$1,值为整行。
      【解决方案3】:

      您可以使用简单的命令来完成。假设您的输入文件是“test.txt”,内容为:

      1 this
      1 that
      1 nye
      2 more
      2 sit
      

      以下命令给出请求的输出:

      sort -n test.txt > tmp1
      (echo; cat tmp1) | paste tmp1 - | egrep '^([0-9])+ *[^ ]* *\1'
      

      【讨论】:

        猜你喜欢
        • 2020-12-30
        • 2011-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-19
        • 2019-04-21
        • 2023-04-10
        • 2011-05-11
        相关资源
        最近更新 更多