【发布时间】:2021-06-10 01:00:11
【问题描述】:
我正在尝试使用 bash 脚本将数百个包含物种名称和比例的样本文件合并到一个长格式文件中。我想知道如何在每行 awk 输出的开头添加一些字符。
我在变量$STEM 中保存了一些sampleID。我使用awk 从每个文件中获取物种名称和比例。比例在每一行的开头;物种名称在每行的末尾(第 6 位)(制表符分隔)。但我还想将 sampleID ($STEM) 添加到输出文件中每一行的开头。这是我的代码:
for file in $input_dir/*_species_abundance.txt
do
STEM=$(basename "$file" _species_abundance.txt )
echo "processing sample $STEM"
awk '{print "$STEM," $1,$6}' FS='\t' $file >> $input_dir/merged_species_abundance.txt
done
"$STEM," 部分无法按预期工作,因为当前输出是“$STEM”,而不是用 sampleID 替换它。
您对如何修改代码有什么建议吗?提前谢谢!
这是一些示例输入:
0.45 124078 0 S 148633 s__Faecalibacterium prausnitzii_D
0.35 95476 0 S 145938 s__Faecalibacterium prausnitzii_C
0.21 57002 0 S 158191 s__Faecalibacterium prausnitzii_I
0.18 49503 0 S 224832 s__Faecalibacterium sp900539945
0.07 18991 0 S 157095 s__Faecalibacterium prausnitzii_G
0.04 12007 0 S 187396 s__Faecalibacterium prausnitzii_F
...
...
第一个数字是比例,最后一个是物种名称。
sampleID 类似于 1001, 1002, 1003, ...
我想要的输出是(逗号分隔):
1001,0.45,s__Faecalibacterium prausnitzii_D
1001,0.35,s__Faecalibacterium prausnitzii_C
1001,0.21,s__Faecalibacterium prausnitzii_I
...
1002,0.28,s__Faecalibacterium prausnitzii_D
1002,0.00,s__Faecalibacterium prausnitzii_C
1002,0.01,s__Faecalibacterium prausnitzii_I
...
1003,0.60,s__Faecalibacterium prausnitzii_D
1003,0.02,s__Faecalibacterium prausnitzii_C
1003,0.39,s__Faecalibacterium prausnitzii_I
...
...
【问题讨论】:
-
TLDR但是从您的awk代码的简单一瞥,它只需要一个-v标志来分配shell 变量。awk -v var="$STEM" '{print var, $1,$6} .... -
this 会回答您的问题吗?顺便说一句,我还建议切换到小写或混合大小写的 shell 变量,以避免与许多对 shell 和/或某些命令具有特殊含义的全大写名称发生意外冲突。
-
@GordonDavisson 谢谢!我在 awk 命令中搜索 -v 选项。该链接非常有帮助。并感谢您的提醒。我的同事使用 STEM 作为变量名,所以我一直使用它......我一定会记住你的提示!
标签: bash awk command-line merge