提取与另一个文件中的单词列表匹配的行

提取与另一个文件中的单词列表匹配的行

我的文件 1 有这些行:

ATM 1434.972183
BMPR2 10762.78192
BMPR2 10762.78192
BMPR2 1469.14535
BMPR2 1469.14535
BMPR2 1738.479639
BMS1 4907.841667
BMS1 4907.841667
BMS1 880.4532628
BMS1 880.4532628
BMS1P17 1249.75
BMS1P17 1249.75
BMS1P17 1606.821429
BMS1P17 1606.821429
BMS1P17 1666.333333
BMS1P17 1666.333333
BMS1P17 2108.460317
BMS1P17 2108

文件 2 有一个单词列表:

ATM
BMS1

所以,输出将是这样的:

ATM 1434.972183
BMS1 4907.841667
BMS1 4907.841667
BMS1 880.4532628
BMS1 880.4532628

我知道这确实是一个重复的问题,但我尝试了所有类型的grepand sedawk也许它会与你们一起使用这个小例子,但我有一个非常大的文件> 1M lines,所有以前的方法都没有帮助

它返回包含这些单词的部分行,尽管其中还有其他单词file 2与来自的行匹配file 1

答案1

grep -Fw -f words myfile

myfile这将提取文件中任何位置包含单词的行words

words由于该选项,中的字符串被视为固定字符串(而不是正则表达式) -F,并且该-w选项确保我们只获得包含完全相同的行单词(不允许单词中的子字符串匹配)。单词是来自字母数字字符和下划线字符集的连续字符序列。

文件中的单词words大多数会列出在单独的行中。

答案2

另一个经典选项是使用 Awk:

$ awk 'NR==FNR {a[$1]++; next} $1 in a' words myfile
ATM 1434.972183
BMS1 4907.841667
BMS1 4907.841667
BMS1 880.4532628
BMS1 880.4532628

该选项对文件条目中的任何尾随空格不敏感words

答案3

尝试join命令:

join file1 file2

ATM 1434.972183
BMS1 4907.841667
BMS1 4907.841667
BMS1 880.4532628
BMS1 880.4532628

相关内容