用来自不同文件的另一列替换文件的一列中的匹配条目

Bhu*_*ale 8 awk

我有两个制表符分隔的文件,如下所示:

文件 1:

NC_008146.1     WP_011558474.1  1155234 1156286 44173
NC_008146.1     WP_011558475.1  1156298 1156807 12
NC_008146.1     WP_011558476.1  1156804 1157820 -3
NC_008705.1     WP_011558474.1  1159543 1160595 42748
NC_008705.1     WP_011558475.1  1160607 1161116 12
NC_008705.1     WP_011558476.1  1161113 1162129 -3
NC_009077.1     WP_011559727.1  2481079 2481633 8
NC_009077.1     WP_011854835.1  1163068 1164120 42559
NC_009077.1     WP_011854836.1  1164127 1164636 7
Run Code Online (Sandbox Code Playgroud)

文件2:

NC_008146.1     GCF_000014165.1_ASM1416v1_protein.faa
NC_008705.1     GCF_000015405.1_ASM1540v1_protein.faa
NC_009077.1     GCF_000016005.1_ASM1600v1_protein.faa
Run Code Online (Sandbox Code Playgroud)

我想将 file1 的第 1 列与 file2 匹配,并用文件 2 的相应第 2 列条目替换自身。输出将如下所示:

GCF_000014165.1_ASM1416v1_protein.faa     WP_011558474.1  1155234 1156286 44173
GCF_000014165.1_ASM1416v1_protein.faa     WP_011558475.1  1156298 1156807 12
GCF_000014165.1_ASM1416v1_protein.faa     WP_011558476.1  1156804 1157820 -3
GCF_000015405.1_ASM1540v1_protein.faa     WP_011558474.1  1159543 1160595 42748
GCF_000015405.1_ASM1540v1_protein.faa     WP_011558475.1  1160607 1161116 12
GCF_000015405.1_ASM1540v1_protein.faa     WP_011558476.1  1161113 1162129 -3
GCF_000016005.1_ASM1600v1_protein.faa     WP_011559727.1  2481079 2481633 8
GCF_000016005.1_ASM1600v1_protein.faa     WP_011854835.1  1163068 1164120 42559
GCF_000016005.1_ASM1600v1_protein.faa     WP_011854836.1  1164127 1164636 7
Run Code Online (Sandbox Code Playgroud)

Tho*_*hor 17

不需要awk,假设文件已排序,您可以使用coreutils join:

join -o '2.2 1.2 1.3 1.4 1.5' file1 file2
Run Code Online (Sandbox Code Playgroud)

输出:

GCF_000014165.1_ASM1416v1_protein.faa     WP_011558474.1  1155234 1156286 44173
GCF_000014165.1_ASM1416v1_protein.faa     WP_011558475.1  1156298 1156807 12
GCF_000014165.1_ASM1416v1_protein.faa     WP_011558476.1  1156804 1157820 -3
GCF_000015405.1_ASM1540v1_protein.faa     WP_011558474.1  1159543 1160595 42748
GCF_000015405.1_ASM1540v1_protein.faa     WP_011558475.1  1160607 1161116 12
GCF_000015405.1_ASM1540v1_protein.faa     WP_011558476.1  1161113 1162129 -3
GCF_000016005.1_ASM1600v1_protein.faa     WP_011559727.1  2481079 2481633 8
GCF_000016005.1_ASM1600v1_protein.faa     WP_011854835.1  1163068 1164120 42559
GCF_000016005.1_ASM1600v1_protein.faa     WP_011854836.1  1164127 1164636 7
Run Code Online (Sandbox Code Playgroud)

如果您的文件没有排序,您可以先对它们进行排序 ( sort file1 > file1.sorted; sort file2 > file2.sorted),然后使用上面的命令,或者,如果您的 shell 支持该<()构造(bash支持),您可以执行以下操作:

join -o '2.2 1.2 1.3 1.4 1.5' <(sort file1) <(sort file2)
Run Code Online (Sandbox Code Playgroud)


ter*_*don 14

你可以很容易地做到这一点awk

$ awk 'NR==FNR{a[$1]=$2; next}{$1=a[$1]; print}' file2 file1
GCF_000014165.1_ASM1416v1_protein.faa WP_011558474.1 1155234 1156286 44173
GCF_000014165.1_ASM1416v1_protein.faa WP_011558475.1 1156298 1156807 12
GCF_000014165.1_ASM1416v1_protein.faa WP_011558476.1 1156804 1157820 -3
GCF_000015405.1_ASM1540v1_protein.faa WP_011558474.1 1159543 1160595 42748
GCF_000015405.1_ASM1540v1_protein.faa WP_011558475.1 1160607 1161116 12
GCF_000015405.1_ASM1540v1_protein.faa WP_011558476.1 1161113 1162129 -3
GCF_000016005.1_ASM1600v1_protein.faa WP_011559727.1 2481079 2481633 8
GCF_000016005.1_ASM1600v1_protein.faa WP_011854835.1 1163068 1164120 42559
GCF_000016005.1_ASM1600v1_protein.faa WP_011854836.1 1164127 1164636 7
Run Code Online (Sandbox Code Playgroud)

或者,因为它看起来像一个制表符分隔的文件:

$ awk -vOFS="\t" 'NR==FNR{a[$1]=$2; next}{$1=a[$1]; print}' file2 file1
GCF_000014165.1_ASM1416v1_protein.faa   WP_011558474.1  1155234 1156286 44173
GCF_000014165.1_ASM1416v1_protein.faa   WP_011558475.1  1156298 1156807 12
GCF_000014165.1_ASM1416v1_protein.faa   WP_011558476.1  1156804 1157820 -3
GCF_000015405.1_ASM1540v1_protein.faa   WP_011558474.1  1159543 1160595 42748
GCF_000015405.1_ASM1540v1_protein.faa   WP_011558475.1  1160607 1161116 12
GCF_000015405.1_ASM1540v1_protein.faa   WP_011558476.1  1161113 1162129 -3
GCF_000016005.1_ASM1600v1_protein.faa   WP_011559727.1  2481079 2481633 8
GCF_000016005.1_ASM1600v1_protein.faa   WP_011854835.1  1163068 1164120 42559
GCF_000016005.1_ASM1600v1_protein.faa   WP_011854836.1  1164127 1164636 7
Run Code Online (Sandbox Code Playgroud)

这假设每个 RefSeq( NC_*) id in 中file1都有一个对应的条目file2

解释

  • NR==FNR:NR 是当前行号,FNR 是当前文件的行号。只有在file2读取第一个文件(此处为)时,两者才会相同。
  • a[$1]=$2; next:如果这是第一个文件(见上文),将第二个字段保存在一个数组中,其键是第一个字段。然后,继续前进next。这确保不会为第一个文件执行下一个块。
  • {$1=a[$1]; print}:现在,在第二个文件中,将第一个字段设置为第一个字段的数组中保存的任何值a(因此,来自 的关联值file2)并打印结果行。

  • 如果第一个文件是空的,@iruvar 什么都不会工作,所以我真的不明白为什么这是相关的。这里的重点是合并来自两个文件的数据。如果任一文件为空,则整个练习毫无意义。 (3认同)
  • @iruvar 如果任一文件为空,则此处没有理智的行为。这就是我要说的 :) 所以试图让它优雅地处理这种情况是没有意义的。而且,在任何情况下,当这里的任何一个文件为空时,都不会打印任何内容。这实际上似乎是最明智的方法,我宁愿没有数据也不愿得到错误的数据。 (3认同)