【发布时间】:2019-05-10 00:11:06
【问题描述】:
awk 的用途对我来说仍然不清楚,但我知道它会对我想要的有用。
我有两个文件,都是制表符分隔的:
transcriptome.txt(十亿行):
>TRINITY_DN261_c0_g1_i1 GATATTTATCCGAATATTCAATATGAT
>TRINITY_DN299_c0_g1_i1 GGACACGGGCCTCAAGCCAAGTCAAAACCACCACAAAG
>TRINITY_DN216_c0_g1_i1 GTTCAATATTCAATGACTGAAGGGCCCGCTGATTTTCCCCTATAAA
>TRINITY_DN220_c0_g1_i1 GGGAGATAATAACAATGATAACACACAAAATTCCAATG
selected_genes.txt(千行):
>TRINITY_DN261_c0_g1_i1 1
>TRINITY_DN220_c0_g1_i1 0
我想要这个输出(selected_genes.txt 的第一列和transcriptome.txt 的第二列):
>TRINITY_DN261_c0_g1_i1 GATATTTATCCGAATATTCAATATGAT
>TRINITY_DN220_c0_g1_i1 GGGAGATAATAACAATGATAACACACAAAATTCCAATG
通常我在 Excel 中使用vlookup 函数。
我尝试使用awk 获得我的结果,就像在许多线程中一样(stackexchange1、stackexchange2、stackoverflow1、stackoverflow2、stackoverflow3 等..)
所以我尝试使用来自这些线程的建议,但我的输出要么是空白,要么只是我的 selected_genes.txt 文件的副本。
我查了一下,我的 2 个文件在 UTF-8 和 CRLF。还有,
awk '{print $1}' `transcriptome.txt`
awk '{print $1}' `selected_genes.txt`
把我文件的第一列给我,所以问题不是来自他们。
这是我尝试过的:
awk -F, 'FNR==NR {a[$1]=$1; next}; $1 in a {print a[$2]}' selected_genes.txt transcriptome.txt > output.txt
# Blank result
awk -F 'FNR==NR{var[$1]=$1;next;}{print var[$1]FS$2}' selected_genes.txt transcriptome.txt > output.txt
# Blank result
awk 'NR == FNR{a[$1] = $2;next}; {print $1, $1 in a?a[$1]: "NA"}' selected_genes.txt transcriptome.txt > output.txt
# Print only transcriptome.txt with first column and NAs
awk -F, 'FNR==NR{var[$1]=$1}FNR!=NR{print(var[$2]","$1)}' selected_genes.txt transcriptome.txt > output.txt
# Print only selected_genes.txt
我没有达到产生想要的输出。 任何解释我的代码有什么问题的建议都将不胜感激。
【问题讨论】:
-
您提到您的 2 个文件以 CRLF 结尾。在使用 UNIX 工具(例如 awk 或加入它们)之前,您应该运行
dos2unix或类似工具以避免任何问题。