gpt4 book ai didi

linux - Bash:如何在文件中保留与另一个文件中的行匹配的字段的行?

转载 作者:可可西里 更新时间:2023-11-01 11:50:01 26 4
gpt4 key购买 nike

我有两个包含大量文本的大文件,我要做的是保留文件 A 中的所有行,这些行的字段与文件 B 中的字段匹配。

文件A是这样的:

Name (tab)  #  (tab)  #  (tab)  KEYFIELD  (tab)  Other fields

文件 B 我设法使用 cut 和 sed 以及其他东西基本上将它归结为一个列表字段。

因此,如果该行的字段与文件 B 中的其中一行匹配,则目标是将文件 A 中的所有行保留在第 4 个字段(它表示 KEYFIELD)中。(不必完全匹配,所以如果文件 B 有 Blah,文件 A 说 Blah_blah,没关系)

我尝试过:

grep -f fileBcutdown fileA > outputfile

编辑:好的,我放弃了。我只是强行杀死了它。

有更好的方法吗?文件 A 为 13.7MB,文件 B 切割后为 32.6MB 给任何关心的人。

编辑:这是文件 A 中的示例行:

chr21 33025905 33031813 ENST00000449339.1 0 - 33031813 33031813 0 3 1835,294,104, 0,4341,5804,

文件 B 中的示例行被删减:

ENST00000111111

最佳答案

这是使用 GNU awk 的一种方法。像这样运行:

awk -f script.awk fileB.txt fileA.txt

script.awk 的内容:

FNR==NR {
array[$0]++
next
}

{
line = $4
sub(/\.[0-9]+$/, "", line)
if (line in array) {
print
}
}

或者,这是单行代码:

awk 'FNR==NR { array[$0]++; next } { line = $4; sub(/\.[0-9]+$/, "", line); if (line in array) print }' fileB.txt fileA.txt

GNU awk 还可以执行您使用 cutsed 描述的 fileB.txt 的预处理>。如果您希望我将其构建到上述脚本中,您将需要提供该行的示例。


使用文件 HumanGenCodeV12GenBasicV12 更新:

运行方式:

awk -f script.awk HumanGenCodeV12 GenBasicV12 > output.txt

script.awk 的内容:

FNR==NR {
gsub(/[^[:alnum:]]/,"",$12)
array[$12]++
next
}

{
line = $4
sub(/\.[0-9]+$/, "", line)
if (line in array) {
print
}
}

这成功打印了 GenBasicV12 中可以在 HumanGenCodeV12 中找到的行。输出文件 (output.txt) 包含 65340 行。该脚本只需不到 10 秒即可完成。

关于linux - Bash:如何在文件中保留与另一个文件中的行匹配的字段的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12536927/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com