答え1
そしてawk
:
$ for param in $(awk '$1 > 20 { print $3 }' inputfile); do ./process.sh "$param"; done
答え2
実際には、シェル自体からデータを解析するのではなく、同様のツールを使用してawk
データを解析できます。
awk -F '[[:blank:]|]+' '$1 > 20 { print $2 }' file
これはawk
、ファイルの各行をパイプ文字またはスペース(スペースまたはタブ)の数に応じて区切られたフィールドのセットとして処理するように指示します。最初のフィールドが20より大きい場合は、2番目のフィールドを印刷します。
関連:
[[:blank:]]*[|][[:blank:]]*
2番目の列にスペースが含まれている場合は、区切り文字として使用する必要があります。
awk -F '[[:blank:]]*[|][[:blank:]]*' '$1 > 20 { print $2 }' file
[|]
リテラルパイプの記号と一致し\\|
(バックスラッシュを好む場合)に置き換えることができます。
次のコマンドは、2番目の列の20より大きい最初の列のすべてのインスタンスをコマンドライン引数として使用してスクリプトを実行します。
awk -F '[[:blank:]]*[|][[:blank:]]*' '$1 > 20 { print $2 }' file |
xargs -I XX ./script.sh XX
-P 4
asオプションなどを使用すると、xargs
スクリプトの複数の並列インスタンスを同時に実行できます(.NETを使用している場合は4つ)-P 4
。
答え3
awk -F'|' '$1 > 20 { system("/path/to/another/script.sh "$2 }' < file.text
これは awk にパイプシンボルに基づいて入力をフィールドに分割するように指示します。 20より大きい値を持つ最初のフィールドは、必要に応じてシステムコールをトリガーします。引数(ここでは$ 2ですが、$ 0またはawkで実行される他の計算である可能性があります)はシェル呼び出しを介してスクリプトに渡されるため、これらの値にシェル特殊文字を含めることができる場合は引用符で囲むときに注意してください。参考にしますステファンの答えの一つこれを行う方法の例:
awk 'function escape(s) {
gsub(/'\''/,"&\\\\&&",s)
return "'\''" s "'\''"
}
{ system("/path/to/another/script.sh" escape($2)) }'
答え4
Gnu sedを試してみることもできます。
sed -E 's/([0-9]*) \| (.*)/[ \1 -gt 20 ] \&\& echo do something with \2/e' infile