微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我有一个包含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

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

解决方法

$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美元)a)

如果$2,$3不是关联数组a中的键,则此条件为真.由于未指定任何操作,因此当此条件为真时,将执行认操作,即打印该行.

更详细的说,当$2,$3是a的关键时,a中的$($2,$3)为真.但是,我们希望条件恰恰相反.因此,我们将awk的否定运算符!应用于它.
> a [$2,$3]

增加了2美元,3美元作为一个关键.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐