我有一个包含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
但它没有给出我的欲望输出。
答案 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。