awkは他の列にその行を追加します。

awkは他の列にその行を追加します。

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

おすすめ記事