Bash 如何用sh迭代awk的每个输出?

Bash 如何用sh迭代awk的每个输出?,bash,shell,awk,sh,Bash,Shell,Awk,Sh,我有一个test.sh文件,它通过一个文本文件test.bed: 1 31 431 1 14 1234 1 54 134 2 435 314 2 314 414 与 是bash扩展-不是由POSIX指定的。这是兼容的 #!/bin/sh awk -F '\t' '$1 == 1 {print $0}' test.bed | while read line; do echo $line # ... more code ... # done 错误是什么?@v

我有一个
test.sh
文件,它通过一个文本文件
test.bed

1   31  431
1   14  1234
1   54  134
2   435 314
2   314 414

bash
扩展-不是由
POSIX
指定的。这是兼容的

#!/bin/sh

awk -F '\t' '$1 == 1 {print $0}' test.bed  | while read line; do
echo $line
    # ... more code ... #
done

错误是什么?@vidit test.sh:第5行:意外标记附近的语法错误
您正在使用哪个环境?我没有经历过这种错误。你能粘贴完整的脚本吗?
阅读后,你可能会重新考虑你的设计。考虑到test.bed、运行工具的目录、环境设置等内容的各种组合,其中充满了会咬你的漏洞。它还有冗余的awk代码,但这并不重要。如果需要这样一个shell循环,那么编写它的方法应该是
awk-F'\t'$1==1'test.bed |而IFS=read-r line;做回显“$line”;完成
。如果您的shell支持使用
printf
以增强健壮性,请使用
echo
。不,我说过这种方法是错误的,即使这种方法是正确的,您的答案仍然是错误的实现方法。请参阅我的第一条评论。如果原始脚本以
#开头,它将正常工作/bin/bash
。我试图在脚本中避免巴沙尔主义,但没有理由让原始海报如此。
test.sh: line 5: syntax error near unexpected token `<'
test.sh: line 5: `done < <(awk -F '\t' '$1 == 1 {print $0}' test.bed )'
#!/bin/sh

awk -F '\t' '$1 == 1 {print $0}' test.bed  | while read line; do
echo $line
    # ... more code ... #
done