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