Unix 读取行时,awk$行并写入变量
我试图根据第五个字段的值将一个文件拆分为不同的较小文件。一个很好的方法是和 然而,我正试图将其合并到qsub的.sh脚本中,但没有取得多少成功 问题是在指定输出行的文件所在的部分 i、 例如,Unix 读取行时,awk$行并写入变量,unix,variables,awk,split,field,Unix,Variables,Awk,Split,Field,我试图根据第五个字段的值将一个文件拆分为不同的较小文件。一个很好的方法是和 然而,我正试图将其合并到qsub的.sh脚本中,但没有取得多少成功 问题是在指定输出行的文件所在的部分 i、 例如,f=“校准”$5.sam”打印>f ,我需要传递一个在脚本前面声明的变量,该变量指定文件应该写入的目录。当我为多个文件发送数组作业时,我需要使用一个为每个任务构建的变量来实现这一点 所以说$output\u path=/Sample1 我需要写一些像这样的东西 f = $output_path "/Alig
f=“校准”$5.sam”打印>f
,我需要传递一个在脚本前面声明的变量,该变量指定文件应该写入的目录。当我为多个文件发送数组作业时,我需要使用一个为每个任务构建的变量来实现这一点
所以说$output\u path
=/Sample1
我需要写一些像这样的东西
f = $output_path "/Alignments_" $5 ".sam" print > f
但它似乎不喜欢有一个不属于awk的$field的$variable。我甚至不认为它喜欢在5美元之前和之后有两条“线”
我得到的错误是,它需要拆分文件的第一行(little.sam
),并尝试这样命名f
,然后是/Alignments_u“$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)
要将shell变量的值(如
$output\u path
传递给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
此外,您的脚本中仍然存在左侧的错误
编辑:
使用-v
创建的awk
变量是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 -
input=$1
outputBase=${input%.bam}
mkdir-v$outputBase\\测试
newdir=$outputBase\\测试
samtools视图-h“$input”| awk-F'[\t:]['-v opath=“$newdir”'
FNR==NR&&NR>=18{
数量[$1]
下一个
}
每件5美元{
f=opath/“路线”“$5.sam”#f
}'Tile\u Number\u List.txt-
您还应该将
NR>=18
移动到第二个awk
脚本中。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
尝试在
$5”之后添加;
“
或将print>f
放在新行中。除非您有非常具体的理由不引用shell变量,并且完全了解在使用非引用变量时出现的文件名换行、通配符扩展等的注意事项和后果,否则请始终引用shell变量。”。另外,在$outputBase\\测试中\\\\
打算做什么?我想你可能是想写“${outputBase}/_TEST”
,但它一点也不清楚。+1,因为你一定忘了你发布了多少关于“如何将shell var与awk结合使用”的答案:@Kent-haha它确实经常出现,可能比任何关于用regexp解析HTML的php
问题都更糟糕。谢谢,sudo_O在附加-v并声明变量后,我仍然会收到一条错误消息。我已经在我的问题后面附加了这个新错误。@kent和sudo_O:(这些都是noob的缺点,我们必须解决它。):(@CarmenSandoval你在你的awk脚本中使用了newdir
,它是shell变量。你用-v
创建的awk
变量是opath
。