2

再会。

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

grep -w -f idFile.txt readingFile.txt

我得到的 Grep 的输出是:

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 选项,但我没有得到我想要的。因此,社区能否请给我一些建议,我该怎么做?

非常感谢您的宝贵时间。

4

3 回答 3

1

我不知道你是否可以只用 grep 来做到这一点,但如果你使用一点 bash,你可以这样做:

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

不过,这将为每个 id 遍历一次 readingFile,因此如果担心性能,这将无济于事。

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

于 2013-05-27T19:57:06.267 回答
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的目的是将它存储在一个数组中。
  • 一旦第一个文件完成,我们的模式将变为错误,第二个pattern-action语句将生效。
  • 第二个pattern-action语句检查您的 idfile 的第一个条目是否存在于数组中。如果是,它会打印它。结果,您将根据 idfile.xml 中找到的序列获得输出。
于 2013-05-27T20:23:49.647 回答
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
于 2013-05-27T20:44:21.123 回答