如何使用awk删除第2列和第3列匹配的行?

时间:2016-05-02 05:27:38

标签: shell awk

我有一个包含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列和第2列的行。 3个值与之前的值相同。例如,第2行和第2行第7列和第2列中的值相同。 3.同样第3行和第3行。 4&第6列和第2列中的值相同。所以我想保留第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

但它没有给出我的欲望输出。

3 个答案:

答案 0 :(得分:4)

$ 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,$3) in a$2,$3的关键字时,a为真。但是,我们希望条件恰恰相反。因此,我们将awk的否定运算符!应用于它。

  • a[$2,$3]

    这会将$2,$3添加为a

  • 的关键字

答案 1 :(得分:3)

另一个较短的问题:

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

答案 2 :(得分:1)

使用多维数组,其中第2列和第3列是索引。然后,您可以使用in测试您是否已经看过该组合。

有关详细信息,请参阅https://www.gnu.org/software/gawk/manual/html_node/Multidimensional.html#Multidimensional