与えられた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' ------------------------
myscript
set 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
ファイルをリンクするために使用します。