awkが$ 0、$ 1、$ 2などのxargsを使用するときにstdin引数の順序を操作する方法はありますか?

awkが$ 0、$ 1、$ 2などのxargsを使用するときにstdin引数の順序を操作する方法はありますか?

xargsを使用してパイプライントラフィックを操作する方法を学びます。標準出力をパイプできないコマンドでコマンドの出力をパイプしなければならないことがよくあります。

awkはそれを使用して印刷するとき、$ 0シンボルがstdout全体を表し、$ 1、$ 2などが別々のフィールドであるのと同等の機能を持っているようですが、xargsではそれに対応する項目が見つからないようです。

例: 次のようになります。標準出力は、順序付けされていない引数のリストです。

file.txt:

secondfield firstfield thirdfield
secondfield2 firstfield2 thirdfield2
secondfield3 firstfield3 thirdfield3

次のように疑似コードを実行したいと思います。

cat file.txt | xargs myprogram $2 $1 $3

私のプログラムは、予想される順序で入力フィールドを取得します。最初のフィールド、2番目のフィールド、3番目のフィールドでなければなりませんが、標準出力の順序が間違っているようです。 $ 1 $ 2 $ 3はawkにのみ存在します。何と同じですか?

(これは単なる例ですが、要点は、他の複雑なコマンド(mvなど)でどの変数がどこにあるかを操作する必要がある場合は、stdoutストリームをxargsにソートする方法を知る必要があるということです。

答え1

これにより:

cat file.txt | xargs myprogram

それは次のように呼び出されるのと同じですmyprogram

myprogram secondfield firstfield thirdfield secondfield2 firstfield2 thirdfield2 secondfield3 firstfield3 thirdfield3

引数が長すぎてコマンドラインに渡すことができない場合は除外されます。これはあなたが始めたいものではありません。逆にしなさい

cat file.txt | xargs --max-lines=1 myprogram

3つの引数で呼び出されますが、myprogramフィールドの順序が正しくありません。変更できない場合は、myprogram小さなPythonプログラムを呼び出します。

#!/usr/bin/env python

import sys
import subprocess

sys.exit(subprocess.call('myprogram', sys.argv[2], sys.argv[1], sys.argv[3]))

によって:

cat file.txt | xargs --max-lines=1 mypythonprog 

答え2

$ xargs -d '\n' -L1 sh -c 'set $1; echo $2 $1 $3' xx  < file.txt 
firstfield secondfield thirdfield
firstfield2 secondfield2 thirdfield2
firstfield3 secondfield3 thirdfield3

関連情報