来自管道的编号参数

时间:2014-11-22 16:40:25

标签: linux bash awk

任何人都可以解释为什么第二个awk不起作用吗?

echo 1 2 3 4 |  echo "`awk '{print $1,$2}'`, `awk '{print $3,$4}'`"
gives me result:
1 2, 

是否有其他方法可以从管道中获取编号参数?我尝试使用xargs,但它返回所有参数。在脚本中,我可以使用echo $1与参数相关,但是从管道中它不起作用。

3 个答案:

答案 0 :(得分:0)

我假设您要为每个输入行启动两个程序,其中包含something 1 2something2 3 4等4个参数。您可以通过以下方式使用

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并仅启动另一个程序,您可以类似地执行此操作,但也可以在命令行中完成。

当然,格伦的解决方案可以用在以下循环中:

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

为什么两个awk不起作用

考虑:

$ 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根本看不到任何输入。