4

だから、私はこの出力を見ていて、少し驚いています:

$ echo "a,b,c,d,e,f,g" | cut -d, -f-4
a,b,c,d
$ echo "a,b,c,d,e,f,g" | cut -d, -f6-
f,g
echo "a,b,c,d,e,f,g" | awk '{ print $0 | "cut -d, -f-4"; print $0 | "cut -d, -f6-"; }'
f,g
a,b,c,d

(ちなみに、これは で行うのはまったくばかげたことだと思いますがawk、それが起こるのを見た唯一のコマンドです!)。

私が理解しているように、これはレコードを2つのコマンドに順番にパイプする必要があります。しかし、何らかの理由で、出力が逆に表示されます。代わりにこれを行うと

$ echo "a,b,c,d,e,f,g" | awk '{ print $0 | "echo hello"; print $0 | "echo goodbye"; }'
hello
goodbye

その後、すべてが私が期待した順序で行われます。これはある種の競合状態に違いないと考えていますがawk、パイプ内のサブコマンドが終了するのを待たないことに驚いています。これは使用に関する既知の問題ですawkか、それとも に固有のものgawkですか? このような落とし穴を回避する方法はありますか?

編集:

私も同じ(逆の)結果を使用して試してみましたmawkが、両方で一貫して発生するようです。

4

2 に答える 2

5

外部コマンドが確実に完了するようにするには、コマンドを閉じる必要があります。

$ echo "a,b,c,d,e,f,g" | awk 'BEGIN {cmd1 = "cut -d, -f-4"; cmd2 = "cut -d, -f6-"} { print $0 | cmd1; close(cmd1); print $0 | cmd2; close(cmd2)}'
a,b,c,d
f,g
于 2012-04-25T16:08:59.620 に答える
4

これには驚きましたが、awk がコマンドを並行して実行していることは明らかです。これを試して:

# time echo "a,b,c,d,e,f,g" | awk '{ print $0 | "sleep 2"; print $0 | "sleep 2"; }'

real    0m2.250s
user    0m0.030s
sys     0m0.060s
于 2012-04-25T16:09:52.117 に答える