コマンドの出力を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
------------------------

このリストをアルファベット順(名前ベース)で並べ替え、変数に保存したいと思います。エンドブロックアークスクリプト。

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

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ディスクからエクスポートすることをお勧めします。

Debian ベースのディストリビューションでは、/run/shm で RAM ドライブを見つけることができるため、同様のことがユーザーのニーズに適している可能性があります。

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

プロセスの実行方法が制限されている場合は、論理およびメモリドライブ制御を使用してフォーマットするだけです。 /run/shm/*の内容はすべて再起動時に削除されるため、処理後にデータを移動することを忘れないでください。これが役に立つことを願っています。必要な内容を私が間違って理解した場合に備えて注意深く見てみましょう。

答え3

あなたはできますすべてをシェルスクリプトに入れますsort印刷する前にAwk出力をパイプしてください。

出力の上下にある行をソートするとします(これは視覚的に意味があります)。

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

myscriptset toexecutableというファイルに保存し、次のようにinputfile呼び出して指定したファイルで実行します。

./myscript inputfile

出力は次のとおりです。

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

"$@"Awkのように、スクリプトが1つではなく複数のファイルパラメータを処理できるようにすることに注意してください。

cat使用をスキップして次のこともできます。

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

しかし、個人的に必要な場所にファイル名を渡すのは好きではありません。できるコードとして解釈されます。だから、catファイルをリンクするために使用します。

関連情報