2つの列を含むファイルを繰り返します。

2つの列を含むファイルを繰り返します。

私の質問は基本的に後続の質問です。このトピック。次のファイルがあります。

1000 | line1
100  | line2
10   | line3

1ドルが20より大きい場合は、2ドルで何かをしたいと思います。真似しようと書いた2番目の答えしかし、うまくいきません。

for a, b in $(cat file.text|cut -d"|" -f 1,2);
do
if ($1>20) echo $2
done;

この目標をどのように達成できますか?ありがとうございます!

答え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 4asオプションなどを使用すると、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

関連情報