管道工作,但bash脚本没有

时间:2015-12-29 07:16:00

标签: linux bash shell sorting awk

我将4行的组转换为单行,然后按第2列对它们进行排序。以下适用于管道,但当我将其转换为2行bash脚本时,第二行不会计算。它与管道一样好,但是如果有人能指出我的bash脚本出错了会有用,以备将来参考。

命令行(工作正常):

cat test.txt | awk '{ printf("%s",$0); n++; if(n%4==0) { printf("\n");} else { printf("\t");} }' | sort -t $'\t' -k2,2 > testout.txt

bash脚本(awk似乎运行但不排序):

#!/bin/bash
awk '{ printf("%s",$0); n++; if(n%4==0) { printf("\n");} else { printf("\t");} }'
sort -t $'\t' -k2,2

输入test.txt:

@1:1:9834:8392:Y
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAT
+1:1:9834:8392:Y
IIHIIIIGGGIIIIDDDIIIIFFFHIGEFEFEFEFE
@1:1:1323:1032:Y
AGCAGCATTGTACAGGGCTATCATGGAATTCTCGGG
+1:1:1323:1032:Y
HHHBHHBHBHGBGGGH8HHHGGGGFHBHHHHBHHHH
@1:1:1610:1033:Y
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+1:1:1610:1033:Y
HHEHHHHHHHHHHHBGGD>GGD@G8GGGGDHBHH4C
@1:1:1679:1032:Y
CGGTGGATCACTCGGCTCGTGCGTCGATGAAGAACG
+1:1:1679:1032:Y
IIIHIIGIIIIIIIDIIIFHEIEDGFEFGECEEEGB

输出testout.txt(所需输出):

@1:1:1610:1033:Y    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA    +1:1:1610:1033:Y    HHEHHHHHHHHHHHBGGD>GGD@G8GGGGDHBHH4C
@1:1:9834:8392:Y    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAT    +1:1:9834:8392:Y    IIHIIIIGGGIIIIDDDIIIIFFFHIGEFEFEFEFE
@1:1:1323:1032:Y    AGCAGCATTGTACAGGGCTATCATGGAATTCTCGGG    +1:1:1323:1032:Y    HHHBHHBHBHGBGGGH8HHHGGGGFHBHHHHBHHHH
@1:1:1679:1032:Y    CGGTGGATCACTCGGCTCGTGCGTCGATGAAGAACG    +1:1:1679:1032:Y    IIIHIIGIIIIIIIDIIIFHEIEDGFEFGECEEEGB

bash脚本用法:

cat test.txt | ./duplicates_1000.sh > testout.txt

bash脚本的输出(awk已执行但未排序):

@1:1:9834:8392:Y    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAT    +1:1:9834:8392:Y    IIHIIIIGGGIIIIDDDIIIIFFFHIGEFEFEFEFE
@1:1:1323:1032:Y    AGCAGCATTGTACAGGGCTATCATGGAATTCTCGGG    +1:1:1323:1032:Y    HHHBHHBHBHGBGGGH8HHHGGGGFHBHHHHBHHHH
@1:1:1610:1033:Y    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA    +1:1:1610:1033:Y    HHEHHHHHHHHHHHBGGD>GGD@G8GGGGDHBHH4C
@1:1:1679:1032:Y    CGGTGGATCACTCGGCTCGTGCGTCGATGAAGAACG    +1:1:1679:1032:Y    IIIHIIGIIIIIIIDIIIFHEIEDGFEFGECEEEGB

提前谢谢。

1 个答案:

答案 0 :(得分:2)

您必须将awk的输出管道传输到sort

#!/bin/bash
awk '{ printf("%s",$0); n++; if(n%4==0) { printf("\n");} else { printf("\t");} }' | sort -t $'\t' -k2,2

或者他们按顺序运行,awk会吃掉所有输入,而sort只剩下任何内容