Unix 读取行时,awk$行并写入变量

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

我试图根据第五个字段的值将一个文件拆分为不同的较小文件。一个很好的方法是和

然而,我正试图将其合并到qsub的.sh脚本中,但没有取得多少成功

问题是在指定输出行的文件所在的部分

i、 例如,
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