![如何提取多行中的公共数字?](https://linux22.com/image/101620/%E5%A6%82%E4%BD%95%E6%8F%90%E5%8F%96%E5%A4%9A%E8%A1%8C%E4%B8%AD%E7%9A%84%E5%85%AC%E5%85%B1%E6%95%B0%E5%AD%97%EF%BC%9F.png)
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 (<>) { ... }
-E
perl 需要执行命令行(在该循环内)。它还增加了使用的可能性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 版本的更多信息。