需要 file2 中与 file1 中存在的相同行

需要 file2 中与 file1 中存在的相同行

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,并将结果作为模式文件使用grepFile2.

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

相关内容