打印重复条目的行号

时间:2015-10-22 21:07:07

标签: linux bash awk sed grep

我有一个以下格式的文件:

ABRA CADABRA
ABRA CADABRA
boys
girls
meds toys

我想要返回任何重复行的行号,因此结果如下所示:

1
2

我更喜欢使用linux工具进行简短的单行命令。我尝试过使用awk和sed但是还没有成功。

6 个答案:

答案 0 :(得分:0)

使用sort,uniq和awk的组合,您可以使用这一系列命令。

sort File_Name | uniq -c | awk '{print $2}'

答案 1 :(得分:0)

这样可行:

nl file.txt | uniq -f 1 -D | cut -f 1
  • nl在每行前面添加一个行号
  • uniq找到重复项
    • -f 1忽略第一个字段,即行号
    • -D仅打印(重复)重复的行
  • cut -f 1仅显示第一个字段(行号)

答案 2 :(得分:0)

下面:

uniq -d < $file | while read line; do grep -hn "$line" $file; done

答案 3 :(得分:0)

这样做:

perl -e 'my $l = 0; while (<STDIN>) { chomp; $l++; if (exists $f{$_}) { if ($f{$_}->[0]++ == 1) { print "$f{$_}->[1]\n"; print "$l\n"; } } else { $f{$_} = [1,$l]; } }' < FILE

丑陋,但适用于未分类的文件。

$ cat in.txt 
ABRA CADABRA
ABRA CADABRA
boys
girls
meds toys
girls
$ perl -e 'my $l = 0; while (<STDIN>) { chomp; $l++; if (exists $f{$_}) { if ($f{$_}->[0]++ == 1) { print "$f{$_}->[1]\n"; print "$l\n"; } } else { $f{$_} = [1,$l]; } }' < in.txt 
1
2
4
6
$ 

编辑:实际上它会略微缩短:

perl -ne '$l++; if (exists $f{$_}) { if ($f{$_}->[0]++ == 1) { print "$f{$_}->[1]\n"; print "$l\n"; } } else { $f{$_} = [1,$l]; }' < in.txt

答案 4 :(得分:0)

让所有&#34;不同&#34;您可以尝试在所有行中重复:

nl input.txt | sort -k 2 | uniq -D -f 1 | sort -n

这不会只给出行号,而是在这些行中找到的副本。省略最后一种排序,将重复项组合在一起。

也尝试跑步:

nl input.txt | sort -k 2 | uniq --all-repeated=separate -f 1

这将通过在重复组之间添加空行来对各种重复项进行分组。

管道结果

| cut -f 1 | sed 's/ \+//g'

仅获取行号。

答案 5 :(得分:0)

<?php ?>