从多个文件中取出特定列

时间:2015-09-22 10:50:27

标签: awk

我有多个文件,如下所示。它们以制表符分隔。对于我想要取出的所有文件第1列以及以 XF:Z:开头的列。这会给我输出1 文件名是 htseqoutput * .sam.sam ,其中*会有所不同。我不确定awk函数的使用,以及for循环是否正确。

// fails:
$.post({
    url: "/example/" + this.id,
    // ...
});

// works:
$.post("/example/" + this.id);

输入示例

for f in htseqoutput*.sam.sam
do
awk ????? "$f" > “out${f#htseqoutput}”
done

输出1:

AACAGATGATGAACTTATTGACGGGCGGACAGGAACTGTGTGCTGATTGTC_11  16  chr22   39715068    24  51M *   0   0   GACAATCAGCACACAGTTCCTGTCCGCCCGTCAATAAGTTCATCATCTGTT IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII AS:i:-12    XN:i:0  XM:i:2  XO:i:0  XG:i:0  NM:i:2  MD:Z:18T31G0    YT:Z:UU XF:Z:SNORD43
GTTTCCTTAGTGTAGCGGTTATCACATTCGCCT_0 16  chr19   4724687 40  33M *   0   0   AGGCGAATGTGATAACCGCTACACTAAGGAAAC   IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII   AS:i:-6 XN:i:0  XM:i:1  XO:i:0  XG:i:0  NM:i:1  MD:Z:26C6   YT:Z:UU XF:Z:tRNA
TCGACTCCCGGTGTGGGAACC_0 16  chr13   45492060    23  21M *   0   0   GGTTCCCACACCGGGAGTCGA   IIIIIIIIIIIIIIIIIIIII   AS:i:-6 XN:i:0  XM:i:1  XO:i:0  XG:i:0  NM:i:1  MD:Z:0C20   YT:Z:UU XF:Z:tRNA

2 个答案:

答案 0 :(得分:2)

好像你可以使用sed:

       var file = new Blob([data], {type: 'application/pdf'});
       var fileURL = URL.createObjectURL(file);
       window.open(fileURL);

这将捕获行开头的部分和sed -r 's/^([ACGT0-9_]+).*XF:Z:([[:alnum:]]+).*/\1\t\2/' file 后面的字母数字部分并输出它们,由制表符分隔。这种方法的一个潜在优势是它可以独立于XF:Z:字符串的位置工作。

您的循环看起来没问题(您可以使用此sed命令代替awk部分)但要小心您的引号。应使用XF:Z:,而不是" /

或者,如果您更喜欢awk(假设您感兴趣的位始终是最后一个字段的一部分),您可以使用自定义字段分隔符:

这可选择将awk -F'[[:space:]](XF:Z:)?' -v OFS='\t' '{print $1, $NF}' file 部分添加到字段分隔符中,以便从最后一个字段的开头删除它。

答案 1 :(得分:1)

如果列号为" XF:Z:"您可以尝试总是在最后

awk 'BEGIN{OFS="\t"}{n=split($NF,a,":"); print $1, a[n]}' file.sam

你明白了,

AACAGATGATGAACTTATTGACGGGCGGACAGGAACTGTGTGCTGATTGTC_11  SNORD43
GTTTCCTTAGTGTAGCGGTTATCACATTCGCCT_0 tRNA
TCGACTCCCGGTGTGGGAACC_0 tRNA

或者,如果此列是每个文件的可变位置

awk 'BEGIN{OFS="\t"}
     FNR==1{
       for(i=1;i<=NF;i++){
         if($i ~ /^XF:Z:/) break
       }
     }
     {n=split($i,a,":"); print $1, a[n]}' file.sam