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


2

我有以下行的文件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


如果众所周知的副本不起作用,那么文件可能存在一些非标准的东西(例如DOS样式的行尾或其他隐藏的嵌入式字符)?
钢铁司机

这是一个很大的文件,我可以快速检查一下,而且还可以,是否有任何命令可以帮助我检查类似的内容?
萨拉·瓦斯

file yourfile可能会报告类似的内容,ASCII text, with CRLF line terminators或者您可以使用cat -A yourfile
steeldriver

Answers:


2
grep -Fw -f words myfile

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

words由于该-F选项,其中的字符串被视为固定字符串(不是正则表达式),并且该-w选项可确保我们仅获得包含完全相同的单词的行(不允许单词中的子字符串匹配)。


不幸的是,我之前尝试过此方法,但它只是返回了不是应该提取的所有行的一部分:(
Sara Wasl

@SaraWasl您能否举一个例子(在问题的文本中),说明在执行此操作时未返回的行以及该行应匹配的字符串?如果您收到任何错误消息,请将这些错误消息也包括在内。
库沙兰丹

在类似问题的小示例中,它是有效的,但在这里,实际的大文件是返回的一部分。因此,例如:它返回的只是我的ATM线路,而不是BMS1线路
Sara Wasl

@SaraWasl当人们无法访问数据时,很难调试类似的东西。如果该grep实用程序失败,该实用程序应该会给您某种形式的错误消息,否则数据可能已损坏或与您想像的不符。
Kusalananda

0

尝试join命令:

join file1 file2

ATM 1434.972183
BMS1 4907.841667
BMS1 4907.841667
BMS1 880.4532628
BMS1 880.4532628

0

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文件条目中的任何尾随空白不敏感。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.