Presidents.txtというファイルがあります。内容は次のとおりです。
First Last Age Years
Geogre W 57 8.0
John A 61 4.0
Thomas J 57 8.0
James M 57 8.0
Andrew J 61 8.0
私に必要なのは、各大統領の年齢と研修を追加できるプログラムだ。たとえば、George Wは57+8.0、John Aは61+4.0などです。各大統領の番号を合計した後、プログラムは最も高い番号を持つ大統領の名前を出力します。たとえば、ここで出力は "Andrew J at 69"でなければなりません。これまでは、大統領ごとに一度に1つずつこれを実行できますが、awkループを使用して実行したいと思います。これまで私が使用したコマンドは次のとおりです。
awk 'NR==2 {print $3+$4}' presidents.txt
これは、数字61と4.0を追加して出力65を提供し、これが開始だと思います。ループと配列を使用する必要があると確信していますが、通常はUnixやコーディングの経験があまりないので、どこから始めるべきかわかりません。助けてくれてありがとう。
ベストアンサー1
$ 3 + $ 4の重複結果がある場合は、入力からその結果の最後の出現のみを印刷したいとします。
$ cat tst.awk
NR>1 {
curYear = $3 + $4
if ( curYear >= maxYear ) {
maxName = $1 OFS $2
maxYear = curYear
}
}
END {
print maxName, "at", maxYear
}
$ awk -f tst.awk file
Andrew J at 69
たとえば、変更された入力ファイルの2人(Andrew J
およびSheila E
)すべての合計値が$ 3 + $ 4(69)の場合:
$ cat file
First Last Age Years
Geogre W 57 8.0
John A 61 4.0
Thomas J 57 8.0
James M 57 8.0
Andrew J 61 8.0
Sheila E 65 4.0
上記のスクリプトを使用して最終出力を取得します。
$ awk -f tst.awk file
Sheila E at 69
たぶんあなたは最初のものが欲しいかもしれません。
$ cat tst.awk
NR>1 {
curYear = $3 + $4
if ( curYear > maxYear ) {
maxName = $1 OFS $2
maxYear = curYear
}
}
END {
print maxName, "at", maxYear
}
$ awk -f tst.awk file
Andrew J at 69
またはすべて:
$ cat tst.awk
NR>1 {
curYear = $3 + $4
if ( curYear >= maxYear ) {
if ( curYear > maxYear ) {
numNames = 0
}
maxNames[++numNames] = $1 OFS $2
maxYear = curYear
}
}
END {
for ( nameNr=1; nameNr<=numNames; nameNr++ ) {
print maxNames[nameNr], "at", maxYear
}
}
$ awk -f tst.awk file
Andrew J at 69
Sheila E at 69