与えられた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
コードとして解釈されます。したがって、ファイルを連結するために使用します。