linux - 管道有效,但 bash 脚本无效

标签 linux bash shell sorting awk

我将每组 4 行转换为单行,然后按第 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

提前谢谢你。

最佳答案

您必须将 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

关于linux - 管道有效,但 bash 脚本无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34506285/

相关文章:

python - 如何从 Python 脚本在后台执行 shell 脚本

linux - 使用 lftp 比较远程目录而不执行传输

regex - 计算使用正则表达式完成的替换次数

bash - 为什么在没有为测试提供任何参数时,在 bash 中使用 -f 进行测试会返回 true?

linux - 基于 View 选项卡定义要在 Jenkins 管道中运行的阶段

linux - 在 FreePascal 中从 Windows 到 Linux 的时区代码转换

c++ - boost 内存映射文件是否在 Linux 上归零

bash - 在 (Git)bash 中,在 key 中设置具有特殊字符的环境变量

linux - 将字符串附加到第二列中所有 CSV 字段末尾的 Shell 脚本

c - 系统调用 execve 不使用 ls 函数返回