如何让Grep的输出与文件中的模式相同?

时间:2013-05-27 19:48:39

标签: linux design-patterns grep

美好的一天。

我使用Grep根据ID文件的模式从文件中提取读数。

grep -w -f idFile.txt readingFile.txt

我获得的Grep I的输出是:

F47807  0.00    0.00    8.30
R02218  0.00    0.00    2.07
W74941  0.00    0.00    5.70
C15915  0.00    0.00    3.63
C16638  0.00    0.39    8.82
C16979  0.00    0.39    2.59

假设ID文件是:

W74941
F47807
C15915
R02218
C16638
C16979

我想让Grep输出与ID文件相同的模式,如下所示:

W74941  0.00    0.00    5.70
F47807  0.00    0.00    8.30
C15915  0.00    0.00    3.63
R02218  0.00    0.00    2.07
C16638  0.00    0.39    8.82
C16979  0.00    0.39    2.59

我试过几个Grep选项,但我没能得到我想要的东西。因此,请社区请您给我一些建议我该怎么做?

非常感谢你的时间。

3 个答案:

答案 0 :(得分:1)

我不知道你是否只能用grep来做这件事,但是如果你使用了一些bash,你可以这样做:

for line in $(cat idFile.txt)
    do grep "$line" readingFile.txt
done

对于每个id,这将覆盖一次readFile,所以如果表现出来担心,这对你没有帮助。

编辑:请注意,这假设id不包含空格。

答案 1 :(得分:1)

稍微awk你可以做这样的事情 -

awk 'NR==FNR {
    a[$1]=$0
    next 
} 
($1 in a) { 
    print a[$1] 
}' <(grep -w -f idFile.txt readingFile.txt) idfile

阐释:

  • awk/pattern/ {action}语句的组合。我们的第一个模式NR==FNR确保我们的操作仅在传递给awk的第一个文件上执行(在我们的例子中是grep输出)。
  • 我们的action就是将它存储在一个数组中。
  • 第一个文件完成后,我们的模式将变为false,第二个pattern-action语句将生效。
  • 第二个pattern-action语句检查您的idfile的第一个条目是否存在于数组中。如果是,则打印出来。因此,您可以根据idfile中的序列获得输出。

答案 2 :(得分:1)

这个单行应该使用你的grep输出和idfile:

awk 'NR==FNR{a[$1]=$0;next}$1 in a&&$0=a[$1]' 

完整的一行:

awk 'NR==FNR{a[$1]=$0;next}$1 in a&&$0=a[$1]' <(grep -w -f idFile.txt readingFile.txt) idfile