我正在尝试将文件拆分为不同的较小文件,具体取决于第五个字段的值。一个非常好的方法是already suggested和also here。
但是,我正在尝试将其合并到qsub的.sh脚本中,但没有太大成功。
问题是在指定输出行的文件部分
即,f = "Alignments_" $5 ".sam" print > f
,我需要传递前面在脚本中声明的变量,该变量指定应该写入文件的目录。我需要在为多个文件发送数组作业时为每个任务构建一个变量。
所以说$output_path
= ./Sample1
我需要写一些像
这样的东西f = $output_path "/Alignments_" $5 ".sam" print > f
但它似乎不喜欢$变量不是属于awk的$字段。我甚至不认为它喜欢在$ 5之前和之后有两个“字符串”。
我得到的错误是文件的第一行被拆分(little.sam
)并尝试命名f
,然后是/ Alignments_“$ 5”.sam“ (最后三个正确地组合在一起)。它自然地说,它的名字太大了。
我怎么写这个有用呢?
谢谢!
awk -F '[:\t]' ' # read the list of numbers in Tile_Number_List
FNR == NR {
num[$1]
next
}
# process each line of the .BAM file
# any lines with an "unknown" $5 will be ignored
$5 in num {
f = "Alignments_" $5 ".sam" print > f
} ' Tile_Number_List.txt little.sam
更新,在添加-V到AWK并宣布变量OPATH之后
input=$1
outputBase=${input%.bam}
mkdir -v $outputBase\_TEST
newdir=$outputBase\_TEST
samtools view -h $input | awk 'NR >= 18' | awk -F '[\t:]' -v opath="$newdir" '
FNR == NR {
num[$1]
next
}
$5 in num {
f = newdir"/Alignments_"$5".sam";
print > f
} ' Tile_Number_List.txt -
mkdir: created directory little_TEST'
awk: cmd. line:10: (FILENAME=- FNR=1) fatal: can't redirect to `/Alignments_1101.sam' (Permission denied)
答案 0 :(得分:1)
要将$output_path
等shell变量的值传递给awk
,您需要使用-v
选项。
$ output_path=./Sample1/
$ awk -F '[:\t]' -v opath="$ouput_path" '
# read the list of numbers in Tile_Number_List
FNR == NR {
num[$1]
next
}
# process each line of the .BAM file
# any lines with an "unknown" $5 will be ignored
$5 in num {
f = opath"Alignments_"$5".sam"
print > f
} ' Tile_Number_List.txt little.sam
此外,您仍然会在脚本中留下previous question错误
修改强>
使用awk
创建的-v
变量为obase
,但您使用newdir
所需的内容:
input=$1
outputBase=${input%.bam}
mkdir -v $outputBase\_TEST
newdir=$outputBase\_TEST
samtools view -h "$input" | awk -F '[\t:]' -v opath="$newdir" '
FNR == NR && NR >= 18 {
num[$1]
next
}
$5 in num {
f = opath"/Alignments_"$5".sam" # <-- opath is the awk variable not newdir
print > f
}' Tile_Number_List.txt -
您还应该将NR >= 18
移到第二个awk
脚本中。
答案 1 :(得分:1)
awk变量就像C变量 - 只需通过名称引用它们来获取它们的值,不需要在它们前面加上“$”就像使用shell变量一样:
awk -F '[:\t]' ' # read the list of numbers in Tile_Number_List
FNR == NR {
num[$1]
next
}
# process each line of the .BAM file
# any lines with an "unknown" $5 will be ignored
$5 in num {
output_path = "./Sample1/"
f = output_path "Alignments_" $5 ".sam"
print > f
} ' Tile_Number_List.txt little.sam