如何提取多行中的公共数字?

如何提取多行中的公共数字?
http://abc/blah/hhh/25927/3456/bb
http://vfg/blahgg/hhvvh/kkk/25927/2378/bb/mm
http://lah/hhh/25927/fff/bb/somthin

在上面几行中,常见的数字是25927总是发生像/25927/它存在于每一行中。但这个数字是一个我事先不知道的变量,所以我不能使用grep 25927;相反,它应该是这样的grep /commonnumber present in all lines/ file

答案1

perl -nE '%a = map { $.==1 || $a{$_} ? ($_,1):()} /(\d+)/g; 
          END{ say keys %a}'   file

解释:

  • -n将在整个程序中添加一个循环,例如:

    while (<>) { ... }
    
  • -Eperl 需要执行命令行(在该循环内)。它还增加了使用的可能性say

  • 每行都分别传递到与/(\d+)/g每个数字(彼此相邻的数字)匹配的行。每个数字如果输入到map.

  • %a是到目前为止所有行中出现的数字的字典。每行 ( ) 都会重新计算%a = ...

  • 在第一行中,$. == 1所有数字都存储在字典中 - 添加对 (number , 1) ; 1代表真

  • 在其他行中,所有数字都被过滤掉,()除非它们也出现在最后一次迭代中$a{$_} ?

  • 最后END{...}打印所有行中重复的所有数字

答案2

$ awk -F/ 'NR==1{for(i=1;i<=NF;i++){Arr[$i]++}next}{for(j=1;j<=NF;j++){if ($j in Arr){Arr[$j]++}}}END{for (k in Arr){if(NR==Arr[k]&&k+0!=0){print k,Arr[k]}}}' input.txt

使用分隔符 / 提取第一行并将其存储在数组中。从第二行开始,检查该字段是否在数组中。如果它存在于数组中,则增加该值。最后,根据行号检查该值并确定其编号。

答案3

如果您知道它始终是由斜杠字符分隔的一行 5 位数字(如上面的路径所示),您可以尝试如下操作:

egrep [/][0-9]{5}[/]文件

如果您使用的是 GNU 版本的 grep 以外的版本,则使用 egrep 可以让您使用扩展的正则表达式语法。请参阅手册页有关您的 grep 版本的更多信息。

相关内容