【问题标题】:How to delete the rows whose column 2 and column 3 matches with some previous using awk?如何删除第 2 列和第 3 列与之前使用 awk 匹配的行?
【发布时间】:2016-05-02 05:27:37
【问题描述】:

我有一个包含 4 列的文件:

ifile.txt
3  5  2  2
1  4  2  1
4  5  7  2 
5  5  7  1 
0  0  1  1
3  5  7  3
5  4  2  2

我想删除第 2 列和第 3 列值与以前相同的行。例如,第 2 行和第 7 行在第 2 和 3 列中具有相同的值。类似地,第 3 和 4 和 6 行在第 2 和 3 列中具有相同的值。所以我想保留第 2 行并删除第 7 行。同样保留第 3 行并删除第 4 行和第 6 行。我的输出是:

ofile.txt
3  5  2  2
1  4  2  1
4  5  7  2
0  0  1  1

我试过这个命令

awk '{a[NR]=$2""$3} a[NR]!=a[NR-1]{print}' ifile.txt > ofile.txt

但它并没有给出我想要的输出。

【问题讨论】:

    标签: shell awk


    【解决方案1】:
    $ awk '!(($2,$3) in a); {a[$2,$3]}' ifile
    3  5  2  2
    1  4  2  1
    4  5  7  2
    0  0  1  1
    

    工作原理

    awk 一次读取输入文件一行。每个输入行都分为多个字段。在这种情况下,重要的字段是第二个,表示为$2,第三个表示为$3

    • !(($2,$3) in a)

      如果$2,$3 不是关联数组a 中的键,则此条件为真。由于没有指定任何动作,当该条件为真时,执行默认动作,即打印该行。

      更详细地说,当$2,$3a 的键时,($2,$3) in a 为真。然而,我们希望条件相反。因此,我们将 awk 的否定运算符 ! 应用于它。

    • a[$2,$3]

      这会将$2,$3 添加为a 的键。

    【讨论】:

      【解决方案2】:

      另一个更短的 awk:

      awk '!seen[$2,$3]++' file
      
      3  5  2  2
      1  4  2  1
      4  5  7  2
      0  0  1  1
      

      这个 awk 命令使用复合键 $2,$3 并将它们存储在数组 seen 中。第一次填充复合键时,其值会增加到 1

      【讨论】:

        【解决方案3】:

        使用多维数组,其中第 2 列和第 3 列是索引。然后你可以用in 测试你是否已经看到了这个组合。

        详情请参阅https://www.gnu.org/software/gawk/manual/html_node/Multidimensional.html#Multidimensional

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-05-10
          • 1970-01-01
          • 2015-11-04
          • 1970-01-01
          • 2020-04-15
          • 1970-01-01
          • 2018-02-14
          • 2016-10-20
          相关资源
          最近更新 更多