Linux 打印重复条目的行号
我有一个以下格式的文件:Linux 打印重复条目的行号,linux,bash,awk,sed,grep,Linux,Bash,Awk,Sed,Grep,我有一个以下格式的文件: ABRA CADABRA ABRA CADABRA boys girls meds toys 我希望返回任何重复行的行号,因此结果如下所示: 1 2 我更喜欢使用linux工具使用一个简短的单行命令。我尝试过使用awk和sed进行试验,但到目前为止还没有成功。结合使用sort、uniq和awk,您可以使用这一系列命令 sort File_Name | uniq -c | awk '{print $2}' 这将有助于: nl file.txt | uniq -f 1
ABRA CADABRA
ABRA CADABRA
boys
girls
meds toys
我希望返回任何重复行的行号,因此结果如下所示:
1
2
我更喜欢使用linux工具使用一个简短的单行命令。我尝试过使用awk和sed进行试验,但到目前为止还没有成功。结合使用sort、uniq和awk,您可以使用这一系列命令
sort File_Name | uniq -c | awk '{print $2}'
这将有助于:
nl file.txt | uniq -f 1 -D | cut -f 1
- 为每行预先添加行号
- 查找重复项
忽略第一个字段,即行号-f1
仅打印重复的行-D
仅显示第一个字段(行号)-f 1
- 此处:
uniq -d < $file | while read line; do grep -hn "$line" $file; done
uniq-d<$file |读取行时;dogrep-hn“$line”$文件;完成
执行以下操作:
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
perl-e'my$l=0;while(){chomp;$l++;if(exists$f{$}){if($f{$}->[0]++==1){print“$f{$}->[1]\n”;print“$l\n”;}}}else{$f{$}=[1,$l];}}
丑陋,但适用于未排序的文件
$ 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
$
$cat in.txt
艾布拉·卡达布拉
艾布拉·卡达布拉
男孩
姑娘们
药物玩具
姑娘们
$perl-e'my$l=0;while(){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
perl-ne'$l++;if(exists$f{${}){if($f{$}->[0]+==1){print“$f{$}->[1]\n”;print“$l\n”;}}}}else{$f{$}=[1,$l];}”
要获取所有行中的所有“不同”副本,您可以尝试:
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'
只获取行号。我不想对姓名列表进行排序。然后使用:cat File_Name | uniq-c | awk'{print$2}'@BryanPoole:更新您的答案比在评论中回答更好-您不需要
cat
。还有,你测试过这个吗?我不认为这是你想要的。对于初学者来说,uniq-c
的输出进入第一个字段。@Benjamin W.实际上返回并重新阅读了他想要的内容,但这并没有实现他想要的内容。他要的是每一个重复单词的行号。我的代码实际上只是对列表进行排序,然后返回唯一的行。@user3299633对排序后的输入文件进行了很好的改进?如果不是,相同的非连续行也会被视为重复行吗?直到命令nl
$ awk '{a[$0]=($0 in a ? a[$0] ORS : "") NR} END{for (i in a) if (a[i]~ORS) print a[i]}' file
1
2