Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 打印重复条目的行号_Linux_Bash_Awk_Sed_Grep - Fatal编程技术网

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