【发布时间】:2016-05-16 16:59:08
【问题描述】:
我有一组制表符分隔的文件,第一列中包含基因标识符,随后的每一列代表一个单独的样本,第一列中包含该给定基因的值。这是我的一个文件的截断示例,其中只有几个示例:
DDR1 8.55578403700418 8.65526857898327 8.71701700266541
MIR4640 8.55578403700418 8.65526857898327 8.71701700266541
RFC2 5.47524925570941 5.88644077981836 5.77277342309348
HSPA6 4.12035662689116 4.01089068869244 3.82366440713502
PAX8
GUCA1A
我从Awk adding constant values、Bash Script Awk if statements 和AWK if length statement append 那里得到了一些想法,由于我有几千行和可能数百列,具体取决于输入文件,我尝试这样编写脚本:
cd ../path/to/file
inputFile=inputFile.in
outputFile=outputFile.out
columnCount= $(awk -F"\t" 'NR==1 {print NF}' $inputFile)
awk '{ for (i = 1; i <= $columnCount; i++)
if (i<$columnCount) {print $0"\t?"}' $inputFile > $outputFile
}'
但我不断收到语法错误。
$ awk -f missingValueAdder.awk
awk: missingValueAdder.awk:3: cd ../path/to/file
awk: missingValueAdder.awk:3: ^ syntax error
awk: missingValueAdder.awk:5: inputFile=inputFile.in
awk: missingValueAdder.awk:5: ^ syntax error
awk: missingValueAdder.awk:6: outputFile=outputFile.out
awk: missingValueAdder.awk:6 ^ syntax error
awk: missingValueAdder.awk:8: columnCount= $(awk -F"\t" 'NR==1 {print NF}' $inputFile)
awk: missingValueAdder.awk:8: ^ invalid char ''' in expression
所以我尝试了这个单线
awk 'for (i=1;i<=NF;i++) BEGIN{FS=OFS="\t"} I<NF{print$0"\t?"}' inputFile.in > outputFile.out
但是从我的 for 循环开始出现另一个语法错误。无论如何,我的输出文件应该看起来像
DDR1 8.55578403700418 8.65526857898327 8.71701700266541
MIR4640 8.55578403700418 8.65526857898327 8.71701700266541
RFC2 5.47524925570941 5.88644077981836 5.77277342309348
HSPA6 4.12035662689116 4.01089068869244 3.82366440713502
PAX8 ? ? ?
GUCA1A ? ? ?
我想打印尽可能多的“?”由 NF 规定(在本例中为 3,但可能多达 100)。非常感激任何的帮助! 谢谢
【问题讨论】:
-
您的脚本是一个 shell 脚本,而不是
awk脚本。 -
阅读 Chris Johnson 的《Shell Scripting Recipes》和 Arnold Robbins 的《Effective Awk Programming, 4th Edition》。
-
@GreysonB 你说你的脚本是制表符分隔的。有
PAX8和GUCA1A的行还有所需的选项卡数,例如在示例中基因名称后的三个选项卡? -
@LarsFischer 好问题。
PAX8等行在第一列之后没有额外的制表符。
标签: bash if-statement for-loop awk