使用awk将第一个文件的列添加到第二个文件。

时间:2017-07-05 00:58:09

标签: awk

希望有人能帮助我完成这项任务。我有两个infiles,

File1

# name                  length  av.qual #-reads mx.cov. av.cov  GC% CnIUPAC CnFunny CnN CnX CnGap   CnNoCov
10-1_rep_c1             1406    80  8017    4637    1641.26 31.98   1   0   4   0   7   0
10-1_rep_c2             832 80  1641    1462    557.34  32.13   1   0   0   0   5   0
10-1_rep_c3             1284    83  4674    2338    1040.80 24.75   7   0   0   0   8   0
10-1_rep_c4             750 83  2335    2017    886.31  24.73   2   0   0   0   3   0
10-1_rep_c5             1180    78  2326    1486    572.51  19.76   1   0   0   0   7   0

File2

>10-1_rep_c1
ttttttttttttttacaataaaatgcrccattattcctttcgtactaaacaatgccttat
ggccaccagatagaaaccaatctgactcacgtcgattttaactcaaatcatgtaaaattc
>10-1_rep_c2
aacagcagaattaatattgttcacaggtttttataaaacgacctattaatgaatttccat
cccctaaaaatggtcggcttacttgatgtaaccaccccctctagttaataataattgtat
>10-1_rep_c3
aattataaaaagaatttttaaagcataaattattagtaattttaagagaaattaaaggta
ttataaaagagtaatagtactgacaaggaaaaacttttatataaaaaaaagaaaatttaa

我想要的outfile是,

>10-1_rep_c1_8017
ttttttttttttttacaataaaatgcrccattattcctttcgtactaaacaatgccttat
ggccaccagatagaaaccaatctgactcacgtcgattttaactcaaatcatgtaaaattc
>10-1_rep_c2_1641
aacagcagaattaatattgttcacaggtttttataaaacgacctattaatgaatttccat
cccctaaaaatggtcggcttacttgatgtaaccaccccctctagttaataataattgtat
>10-1_rep_c3_4674
aattataaaaagaatttttaaagcataaattattagtaattttaagagaaattaaaggta
ttataaaagagtaatagtactgacaaggaaaaacttttatataaaaaaaagaaaatttaa

因此第一个文件的第四列附加到每个DNA序列的第二个文件头上。

2 个答案:

答案 0 :(得分:1)

尝试关注并告诉我这是否对您有所帮助。

awk 'FNR==NR{a[$1]=$4;next} ($2 in a){print $2"_"a[$2];next} 1' file1 FS=">" file2

说明:因此首先检查条件FNR==NR(当读取第一个名为file1的文件时,它将仅为TRUE,因为FNR和NR都表示Input_file中的行数只有它们之间的区别是NR的值将继续增加,直到所有文件被读取,并且每当新的Input_file开始被读取时FNR的值将是RESET。),所以在第一个文件读取时间创建一个名为a的数组,其索引是1美元,价值是4美元(根据你的要求),现在提到下一个关键字,这将确保光标不会更进一步,它将跳过所有进一步的声明。 现在检查条件,检查file2的2美元(我将其字段分隔符设置为>将其从混合中删除,注意:我们可以为不同的Input_files 设置不同的字段分隔符。)

因此,如果它存在,则打印Input_file file2的第二个字段和“_”,然后打印其索引为file2的$ 2的数组a的值,然后提及下一个跳过进一步的语句。现在提到1将打印行(除了其中$ 2以数组a作为索引,因此awk在方法上工作,然后行动。如果任何条件为TRUE则应该发生一些动作。这里条件为TRUE,提及1和动作未定义,因此默认打印将发生,打印当前行的文件2)。

然后将Input_file1名称称为file1。之后提到FS(字段分隔符的值)为“>”(上面也解释过)。之后再提到第二个Input_file为file2。

答案 1 :(得分:1)

这是使用awk的替代方法:

awk 'FNR==NR{a[">"$1]="_"$4;next}{print $0a[$0]}' File1 File2