我的文件 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
我知道这确实是一个重复的问题,但我尝试了所有类型的grep
and sed
,awk
也许它会与你们一起使用这个小例子,但我有一个非常大的文件> 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