次の行を含むファイルがあります。
5 3 6 4 2 3 5
1 4 3 2 6 5 8
..
各行の最小値を取得したいので、たとえば上記の入力を使用すると、次のようになります。
min of first line: 2
min of second line: 1
..
各行の任意の数の列に対して awk を使用してこれを行うにはどうすればよいですか?
単語の代わりに数字を使用して出力を気にしない場合は、次の1つのライナーを使用できます。
$ awk '{m=$1;for(i=1;i<=NF;i++)if($i<m)m=$i;print "min of line",NR": ",m}' file
min of line 1: 2
min of line 2: 1
本当に序数で数えたい場合:
BEGIN {
split("first second third fourth",count," ")
}
{
min=$1
for(i=1;i<=NF;i++)
if($i<min)
min=$i
print "min of",count[NR],"line: \t",min
}
これをに保存して、次script.awk
のように実行します。
$ awk -f script.awk file
min of first line: 2
min of second line: 1
明らかに、これは最大4行のファイルに対してのみ機能しますが、序数リストを必要と思われる最大数まで増やすだけです。あなたはかなり簡単にオンラインでリストを見つけることができるはずです。
あなたの問題は非常に単純です。min
スクリプトの一部で変数を定義するBEGIN
だけで、各行で、最小要素に対して単純なCのようなアルゴリズムを実行する必要があります(最初のフィールドをとして設定してmin
から、次のフィールドなど、行の最後のフィールドに到達するまで続きます)。変数NFがあるため、行のフィールドの総数がわかります。つまり、forループを作成するだけです。その行に対してforループが完全に実行されると、最小限の要素が手に入り、それを印刷することができます。