加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

排序 – 使用awk删除包含唯一第一个字段的行?

发布时间:2020-12-13 23:49:33 所属栏目:Linux 来源:网络整理
导读:希望仅打印具有重复的第一个字段的行.例如从看起来像这样的数据: 1 abcd1 efgh2 ijkl3 mnop4 qrst4 uvwx 应打印出来: 1 abcd1 efgh4 qrst4 uvwx (仅供参考 – 我的数据中第一个字段的长度不总是1个字符) 解决方法 awk 'FNR==NR{a[$1]++;next}(a[$1] 1)' ./
希望仅打印具有重复的第一个字段的行.例如从看起来像这样的数据:

1 abcd
1 efgh
2 ijkl
3 mnop
4 qrst
4 uvwx

应打印出来:

1 abcd
1 efgh
4 qrst
4 uvwx

(仅供参考 – 我的数据中第一个字段的长度不总是1个字符)

解决方法

awk 'FNR==NR{a[$1]++;next}(a[$1] > 1)' ./infile ./infile

是的,你给它输入两次相同的文件.由于您不知道当前记录是否为uniq,因此您在第一次传递时基于$1构建一个数组,然后您只输出在第二次传递中多次看到$1的记录.

我确信只有一次通过文件才能做到这一点,但我怀疑它们会像“干净”一样

说明

> FNR == NR:仅当awk正在读取第一个文件时才会出现这种情况.它主要测试所看到的记录总数(NR)与当前文件(FNR)中的输入记录.
> a [$1]:构建一个关联数组,一个人的关键是第一个字段($1),每次看到谁的值增加一.
> next:如果达到此目的,则忽略脚本的其余部分,重新??开始输入新记录
>(a [$1]> 1)这只会在./infile的第二次传递中进行评估,它只会打印我们多次看到的第一个字段($1)的记录.从本质上讲,它是if(a [$1]> 1){print $0}的简写

概念证明

$cat ./infile
1 abcd
1 efgh
2 ijkl
3 mnop
4 qrst
4 uvwx

$awk 'FNR==NR{a[$1]++;next}(a[$1] > 1)' ./infile ./infile
1 abcd
1 efgh
4 qrst
4 uvwx

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读