读取行时,awk $行和写入变量

时间:2013-05-06 21:38:19

标签: unix variables awk split field

我正在尝试将文件拆分为不同的较小文件,具体取决于第五个字段的值。一个非常好的方法是already suggestedalso 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)

2 个答案:

答案 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