コマンドの出力をawkスクリプト本体の変数にパイプする

コマンドの出力をawkスクリプト本体の変数にパイプする

与えられたinputfile

Cherries:20:100:300
Beans:12:400:500
Tomatoes:32:445:234
Potatoes:24:400:200
Kiwis:23:230:435

次のような awk スクリプトがありますtestscript.script:

BEGIN{ FS = ":" 
print "------------------------"
}

if($3 + $4 > 500) {print $1, $2}
END{
print "------------------------" 
}

このスクリプトを呼び出すと、出力はawk -f testscript.script inputfile次のようになります。

------------------------
Beans 12
Tomatoes 32
Potatoes 24
Kiwis 23
------------------------

このリストをアルファベット順(名前順)に並べ替え、変数に保存して、このリストを印刷できるようにします。エンドブロックawk スクリプトの。

つまり、コードは次のようになります。

BEGIN{ FS = ":" 
print "------------------------"
}

*if($3 + $4 > 500) {print $1, $2 | "sort" = variable}
END{
print "------------------------" 
print variable
}

そしてそのprint variable命令は

------------
------------
Beans 12
Kiwis 23
Potatoes 24
Tomatoes 32

ソートされた項目のリストを変数として使用し、点線の後の END ブロックに出力します。

これを行う最善の方法は何ですか?

答え1

echo "---------------";awk -F: '$3+$4>500{print $1,$2}' inputfile |sort && echo "---------------"

awkを使用する

awk -F: '$3+$4>500{Arr[$1]=$2}END{n=asorti(Arr,SArr);for(i=1;i<=n;i++){print SArr[i],Arr[SArr[i]]}}' inputfile

答え2

「最善」の方法を考えるとき、多くのことが関係しますが、私は自分のニーズを満たす最速のルートが最善だと考えています。プロセスの範囲を超えて変数を渡そうとしている場合は、それを RAM ドライブにパイプ出力することをお勧めします。ほとんどすべてのディストリビューションには RAM ドライブがあります。その後、テストを処理し、完了したらその RAM ディスクからパイプ出力します。

Debian ベースのディストリビューションでは、RAM ドライブが /run/shm に配置されているため、次のようなものがニーズを満たす可能性があります。

cat inputdata.file | sed 's/:/ /g' | awk '{print $1" "$2}' | sort -k 1,1 > /run/shm/datastore.file; echo '------------------------' > datastore2.file; cat /run/shm/datastore.file>>/run/shm/datastore2.file; cat /run/shm/datastore2.file>~/destination.file

プロセスが何かを実行する方法が制限されている場合は、ロジックと RAM ドライブを使用してフォーマットを制御するだけです。再起動すると /run/shm/* 内のデータはすべて消えてしまうため、処理後にデータを移動することを忘れないでください。これがお役に立てば幸いです。必要なことを誤解していないか注意します。

答え3

あなたはできるすべてをシェルスクリプトに貼り付けるAwk 出力をsort印刷する前にパイプします。

ソートされた出力の上と下の行が必要だと仮定します (視覚的にわかりやすいと思います):

#!/bin/sh
printf '%s\n' ------------------------
cat "$@" | awk -F: '($3 + $4 > 500) {print $1, $2}' | sort
printf '%s\n' ------------------------

これを というファイルに保存し、myscript実行可能に設定して、次のようにinputfile呼び出して指定した で実行します。

./myscript inputfile

出力は次のようになります。

------------------------
Beans 12
Kiwis 23
Potatoes 24
Tomatoes 32
------------------------

"$@"このスクリプトでは、Awk と同じように、1 つだけではなく複数のファイル引数を処理できるように を使用していることに注意してください。

使用をスキップしcatて、次のように実行することもできます。

awk -F: '($3 + $4 > 500) {print $1, $2}' "$@" | sort

しかし、私は個人的には、ファイル名を渡すのが好きではありません。できたcatコードとして解釈されます。したがって、ファイルを連結するために使用します。

関連情報