File1 每行包含数字(0 到 9 位长度),总记录 20k File2 第一列包含数字(0 到 9 位),每行包含其他信息,总共记录 46 ,000,00 两个文件均已排序。需要 grep file2 中所有在 file1 中具有公共条目的记录
文件1
988676562
99373
133838000
文件2
99373 dhdhdhdhd, 3838 dheueie,aaaa
133838000 rrtyusbjsjs,382 djdjdjsusu
2233747 Eheueueu. ,446,ttttiieenjs
44577333 Euedjdbebe,777,rrididjd
输出
99373 dhdhdhdhd, 3838 dheueie,aaaa
133838000 rrtyusbjsjs,382 djdjdjsusu
我尝试过fgrep -f file1 file2
,但输出为零
让我澄清一下,两个文件中的第一列完全相同
答案1
我不确定你的是否File1
包含空行。这就是为什么我确保忽略没有数字的行。此外,您的示例File1
似乎包含尾随空格。这样我将删除所有前导和尾随非数字字符。
您可以使用此文件sed
创建模式grep
,并将结果作为模式文件使用grep
到File2
.
grep -f <(grep '[0-9]' File1 | sed 's/[^0-9]*\([0-9]*\).*/^\1[^0-9]*.*$/' ) File2
这打印
99373 dhdhdhdhd, 3838 dheueie,aaaa
133838000 rrtyusbjsjs,382 djdjdjsusu
解释:
提取包含数字的行
grep '[0-9]' File1
删除可能的前导和尾随垃圾,并创建一个模式来grep
查找行开头的数字,后跟非数字字符和其他任何字符,或者直到行尾都没有。
sed 's/[^0-9]*\([0-9]*\).*/^[^0-9]*\1[^0-9]*.*$/'
答案2
对于这种工作来说,join
是非常有用的。使用 join 时请记住,两个文件都按列排序,这两个文件中的列是相同的。
这是解决方案
sort -o file1 file1 #sort and save content of file1
sort -o file2 file2 #sort and save content of file2
join file1 file2
答案3
一种可能的解决方案(检查空行):
while read line; do [ ${#line} -gt 0 ] && grep "$line" File2; done < File1
答案4
使用下面的命令进行测试,效果很好
命令
普拉文@普拉文:~$awk 'NR==FNR{a[$1];next}($1 in a){print $0}' file1 file2
输出
普拉文@普拉文:~$awk 'NR==FNR{a[$1];next}($1 in a){print $0}' file1 file2
99373 dhdhdhdhd, 3838 dheueie,aaaa
133838000 rrtyusbjsjs,382 djdjdjsusu