任何人都可以解释为什么第二个awk不起作用吗?
echo 1 2 3 4 | echo "`awk '{print $1,$2}'`, `awk '{print $3,$4}'`"
gives me result:
1 2,
是否有其他方法可以从管道中获取编号参数?我尝试使用xargs,但它返回所有参数。在脚本中,我可以使用echo $1
与参数相关,但是从管道中它不起作用。
答案 0 :(得分:0)
我假设您要为每个输入行启动两个程序,其中包含something 1 2
和something2 3 4
等4个参数。您可以通过以下方式使用awk:
echo 1 2 3 4 | awk '{system("something "$1" "$2); system("something2 "$3" "$4);}'
测试:
echo -e "1 2 3 4\n11 22 33 44" | awk '{system("/bin/echo A "$1" "$2); system("/bin/echo B "$3" "$4);}'
输出:
A 1 2
B 3 4
A 11 22
B 33 44
或者,如果您想以某种方式格式化四个args并仅启动另一个程序,您可以类似地执行此操作,但也可以在bash命令行中完成。
当然,格伦的解决方案可以用在以下循环中:
echo -e "1 2 3 4\n11 22 33 44"|while read -r -a a; do
something ${a[0]} ${a[1]}; something2 ${a[2]} ${a[3]}
done
或
while read -r -a a; do
something ${a[0]} ${a[1]}; something2 ${a[2]} ${a[3]}
done < <(echo -e "1 2 3 4\n11 22 33 44")
(请注意<
个字符之间的空格)
我希望这有帮助!
答案 1 :(得分:0)
另一种方法:只使用shell的read
命令
read a b c d <<END
1 2 3 4
END
echo "$a $b, $c $d"
答案 2 :(得分:0)
这是一种在管道内捕获stdin
作为编号位置参数的方法:
$ echo 1 2 3 4 | { read; set -- $REPLY; echo "A $1 $2"; echo "B $3 $4"; }
A 1 2
B 3 4
{
这会启动一个小组。该组允许我们在管道内一起执行多个语句。空格必须遵循{
。
read
shell内置read
接受一行标准输入并将其分配给变量REPLY
。
set -- $REPLY
set
是内置的另一个shell。它用于将REPLY
中的字符串分配给shell的位置参数:$1
,$2
,等。
set
之后的破折号用于表示选项的结束。这保证了后面的内容被视为参数,而不是选项,即使它恰好以破折号开头。
echo "A $1 $2"; echo "B $3 $4";
这表明我们已成功分配了位置参数。
}
这使团体关闭。空格和分号(或只是换行符)必须位于}
之前。
以上仅针对{...}
组的持续时间设置位置参数。
假设您想要在管道结束后保留编号的位置参数。在那种情况下:
read < <(echo 1 2 3 4)
set -- $REPLY
echo "A $1 $2"
echo "B $3 $4"
这会产生输出:
A 1 2
B 3 4
考虑:
$ echo 1 2 3 4 | echo "`awk '{print $1,$2}'`, `awk '{print $3,$4}'`"
1 2,
当第一个awk
命令运行时,它会消耗所有stdin。我们运行第二个awk
命令,没有剩余的输入来处理它。
如果我们简化上述命令,删除echo
和命令替换可能会更清楚:
$ echo 1 2 3 4 | { awk '{print $1,$2","}'; awk '{print $3,$4}'; }
1 2,
让我们打印出每个awk
看到的完整输入行:
$ echo 1 2 3 4 | { awk '{print "first="$0;}'; awk 'BEGIN{print "2nd awk starting"}{print "second="$0}'; }
first=1 2 3 4
2nd awk starting
第一个awk
读取所有输入。第二个awk
根本看不到任何输入。