希望有人能帮助我完成这项任务。我有两个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序列的第二个文件头上。
答案 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