我尝试在以下脚本中合并来自两个不同文件的列:
#!/bin/sh
#
#
echo "1 1 1" > tmp1
echo "2 2 2" >> tmp1
echo "3 3 3" >> tmp1
echo "a,b,c" > tmp2
echo "a,b,c" >> tmp2
echo "a,b,c" >> tmp2
paste -d':' <(cut -d" " -f1 tmp1) <(cut -d"," -f 1-2 tmp2)
当我运行
时,上面的脚本运行正常bash test.sh
但是,当我运行
时,它不起作用sh test.sh
我收到以下错误消息
test.sh: line 13: syntax error near unexpected token `('
test.sh: line 13: `paste -d':' <(cut -d" " -f1 tmp1) <(cut -d"," -f 1-2 tmp2)'
有人可以解释这种行为的原因是什么?有修复吗? THX。
答案 0 :(得分:1)
在您的系统上,sh
可能未设置为bash
(dash
可能是?)。
流程替换<()
是bash
- ism(实际上来自ksh
),它不是由POSIX定义的,因此不可移植。
所以你正在使用的shell(sh
)没有<()
实现,因此(
上的语法错误(如<
表示输入重定向所以错误实际上显示的是第一个(
)。
答案 1 :(得分:0)
您可以使用文件描述符
移植实现此功能while
IFS=" " read -r x rest <&3
IFS="," read -r y z rest <&4
do
echo "$x:$y:$z"
done 3<tmp1 4<tmp2
1:a:b
2:a:b
3:a:b
使用短划线
进行测试答案 2 :(得分:0)
<()
提供了手动管理命名管道的语法替代方法。
trap 'rm p1 p2' EXIT
mkfifo p1 p2
cut -d " " -f1 tmp1 > p1 &
cut -d " " -f 1-2 tmp2 > p2 &
paste -d':' p1 p2