【问题标题】:How to replace the values of a file by the values of another file?如何用另一个文件的值替换文件的值?
【发布时间】:2019-10-27 03:09:40
【问题描述】:

我解释我的问题:

我有两个文件,一个看起来像这样(它是一个 .tsv 文件,每一行的列数不一定相同):

OTU0001 Archaea
OTU0002 Archaea;Aenigmarchaeota;Deep Sea Euryarchaeotic Group(DSEG);uncultured archaeon
OTU0003 Archaea;Altiarchaeales;uncultured euryarchaeote
OTU0004 Archaea;Bathyarchaeota;uncultured archaeon
OTU0005 Archaea;Diapherotrites;uncultured euryarchaeote
OTU0006 Archaea;Euryarchaeota;Halobacteria;Halobacteriales;Halobacteriaceae;uncultured
OTU0007 Archaea;Euryarchaeota;Halobacteria;Halobacteriales;Halobacteriaceae;uncultured;marine metagenome

每一行都以 OTUXXXX 开头,并且此 id 始终位于第一列。

另一个文件是 .tsv 文件,包含 3 列:

OTU3978 UniRef90_A0A010P3Z8 0.846
OTU0006 UniRef90_A0A010P3Z8 0.855
OTU4929 UniRef90_A0A010P3Z8 0.829
OTU4317 UniRef90_A0A011P550 0.85
OTU4816 UniRef90_A0A011P550 0.807
OTU3902 UniRef90_A0A011QPQ2 0.836
OTU3339 UniRef90_A0A011RKI6 0.835
OTU1359 UniRef90_A0A011RLA7 0.801
OTU2085 UniRef90_A0A011RLA7 0.843
OTU3542 UniRef90_A0A011RLA7 0.866

我想将第二个文件中的每个 OTUXXX 替换为第一个文件的第二列。例如,它应该给出(对于第二个文件的第二行):

OTU0006UniRef90_A0A010P3Z8 0.855 变成:

Archaea;Euryarchaeota;Halobacteria;Halobacteriales;Halobacteriaceae;uncultured UniRef90_A0A010P3Z8 0.855

在 bash 中可以吗?

编辑:

我可以用那个替换列

awk 'FNR==NR{a[NR]=$2;next}{$1=a[FNR]}1' f1 f2

但它不是'自动',文件1的第一行会匹配文件2的第一行...根据OTUXXX的值没有变化

【问题讨论】:

  • 你有尝试过吗?
  • 实际上,我可以用 awk 'FNR==NR{a[NR]=$2;next}{$1=a[FNR]}1' f1 f2 替换列。但它不是“自动”的,文件 1 的 first 行将与文件 2 的 first 行匹配......根据“OTUXXX”的值 ...
  • 请在您的问题中发布此awk 代码作为您的尝试,以便更容易理解您想要实现的目标以及问题所在。

标签: bash file awk


【解决方案1】:

你已经很接近了。你也许可以使用这个awk

awk 'NR == FNR {a[$1] = $2; next} $1 in a{$1 = a[$1]} 1' f1 f2

OTU3978 UniRef90_A0A010P3Z8 0.846
Archaea;Euryarchaeota;Halobacteria;Halobacteriales;Halobacteriaceae;uncultured UniRef90_A0A010P3Z8 0.855
OTU4929 UniRef90_A0A010P3Z8 0.829
OTU4317 UniRef90_A0A011P550 0.85
OTU4816 UniRef90_A0A011P550 0.807
OTU3902 UniRef90_A0A011QPQ2 0.836
OTU3339 UniRef90_A0A011RKI6 0.835
OTU1359 UniRef90_A0A011RLA7 0.801
OTU2085 UniRef90_A0A011RLA7 0.843
OTU3542 UniRef90_A0A011RLA7 0.866

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-14
    • 2018-01-22
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    • 2018-06-27
    • 1970-01-01
    相关资源
    最近更新 更多