如何从文件1中匹配文件2的内容并按照文件2的顺序将它们放入?使用grep命令。

4

我有一个名为 file1.txt 的文件,它的内容如下:

rs002
rs113
rs209
rs227
rs151 
rs104

我有一个名为file2.txt的文件,其中包含如下内容:

rs113   113
rs002   002
rs227   227
rs209   209
rs104   104
rs151   151

我想获取与file1.txt中记录匹配的file2.txt的行,我尝试了以下方法:

grep -Fwf file1.txt file2.txt 

以下是输出结果:
rs113   113
rs002   002
rs227   227
rs209   209
rs104   104
rs151   151

这会提取所有匹配的行,但顺序是按照file2.txt中出现的顺序。有没有办法在提取匹配记录的同时保持从file1.txt中的顺序?期望的输出如下:

rs002   002
rs113   113
rs209   209
rs227   227
rs151   151
rs104   104

你尝试过反转参数吗?- grep -Fwf file2.txt file1.txt - adarshr
@adarshr 这样做行不通。这个grep命令的作用基本上是将第一个文件用作要查找的模式,将第二个文件用作要在其中查找模式的文件。据我所知,你不能仅通过使用grep命令来欺骗排序顺序。也许awk或comm可以帮助解决问题(不确定)。 - randombee
@adarshr 尝试反转文件,但正如 user--randombee 所说,第一个文件是我们想要第二个文件遵循子集的特定模式的文件。 - reneesummer
4个回答

2
一种(虽然不太优雅的)解决方案是循环遍历file1.txt,并查找每行的匹配项:
while IFS= read -r line; do
    grep -wF "$line" file2.txt
done < file1.txt

它会输出:
rs002   002
rs113   113
rs209   209
rs227   227
rs151   151
rs104   104

如果您知道每行最多只出现一次,可以通过告诉grep在第一次匹配后停止来加速:
grep -m 1 -wF "$line" file2.txt

这是我所知道的GNU扩展。
请注意,循环遍历文件以在每次循环中对另一个文件进行某些处理通常是一种表明有更高效的方法来完成任务的迹象,因此这种方法可能仅适用于文件足够小,以至于想出更好的解决方案的努力比使用此解决方案处理它们花费的时间更长。

一旦我达到15个声望,我会回来投赞成票! - reneesummer
这样发布解决方案存在一个危险,就是新手可能会认为这是正确的方法,而不仅仅是一个有趣的轶事。reneesummer,请阅读Benjamin建议的链接http://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-to-process-text-considered-bad-practice,然后接受[@Thor的答案](https://dev59.com/r5Xfa4cB1Zd3GeqPl-gk#36524323),我相信Benjamin会同意这是正确的解决方案。 - Ed Morton

2

对于 grep 来说,这太过复杂了。如果 file2.txt 不是很大,即它可以放入内存中,你应该使用 awk

 awk 'FNR==NR { f2[$1] = $2; next } $1 in f2 { print $1, f2[$1] }' file2.txt file1.txt

输出:

rs002 002
rs113 113
rs209 209
rs227 227
rs151 151
rs104 104

0

从file2创建一个sed命令文件

 sed 's#^\([^ ]*\)\(.*\)#/\1/ s/$/\2/#' file2 > tmp.sed
 sed -f tmp.sed file1

这两行代码可以合并,避免使用临时文件

sed -f <(sed 's#^\([^ ]*\)\(.*\)#/\1/ s/$/\2/#' file2) file1

-1

这应该会有所帮助(但对于大输入不是最优的):

$ for line in `cat file1.txt`; do grep $line file2.txt; done

2
请在含有多个单词的行中使用 "$line" - Walter A
完全错误的方法,存在许多问题。请参阅http://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-to-process-text-considered-bad-practice - Ed Morton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接