用于查找重复项的基本grep / sed / awk脚本

时间:2014-11-11 22:14:23

标签: regex awk sed grep

我开始使用正则表达式和grep,我想知道如何做到这一点。我有这个清单:

1. 12493 6530
2. 12475 5462
3. 12441 5450
4. 12413 5258
5. 12478 4454
6. 12416 3859
7. 12480 3761
8. 12390 3746
9. 12487 3741
10. 12476 3557
...

我想只获取中间列的内容(因此在awk中NF == 2?)。这里的分界符是一个空格。

然后我想找到不止一次的数字(重复)。我该怎么做呢?谢谢,我是初学者。

3 个答案:

答案 0 :(得分:4)

使用

awk '{count[$2]++}END{for (a in count) {if (count[a] > 1 ) {print a}}}' file

但是你在第二栏中没有重复的数字。

  • awk中的第二列是$2
  • count[$2]++使用处理后的数字作为键
  • 递增数组值
  • END块在@末尾执行,我们测试每个数组值以找到那些具有+1
  • 的块

并有更好的简洁(jthill的信用)

awk '++count[$2]==2{print $2}' file

答案 1 :(得分:2)

使用perl:

perl -anE '$h{$F[1]}++; END{ say for grep $h{$_} > 1, keys %h }'

迭代行并使用第二列值(%h)的计数($h{...})构建哈希值(++ / $F[1]),之后( END{ ... }say所有哈希key的计数($h{$_}> 1

答案 2 :(得分:-1)

将数据存储在测试中,

使用awk,uniq和grep命令的组合

 cat test | awk -v x=2 '{print $x}' | sort | uniq -c | sed  '/^1 /d' | awk -v x=2 '{print $x}'

说明:

awk -v x=2 '{print $x}'

选择第二列

uniq -c 

计算每个数字的外观

sed  '/^1 /d'

删除只有一个外观的所有条目

awk -v x=2 '{print $x}'

再次使用awk删除数字计数