awkを使用して行の前にシリアル番号を降順に追加する方法

awkを使用して行の前にシリアル番号を降順に追加する方法

現在私はawk '{print NR,$0}' このコマンドを使用してファイルのシリアル番号を印刷しています。しかし、シリアル番号を降順に印刷する方法は?

現在の出力:

1 abcd
2 abcd
3 abcd
4 abcd

希望の出力:

4 abcd
3 abcd
2 abcd
1 abcd

答え1

awk代わりに、独自の(より冗長な)スクリプトを書くのを避けるためのツールを使用してください。

非標準tacユーティリティを使用してファイルの行を逆順に出力し、非cat標準-nオプションを使用して行番号を付けます。

tac file | cat -n | tac

答え2

注:この回答では、テキスト行の元の順序を維持しながら行番号を「カウントダウン」することが目標であると想定しています。これに関して、投稿のフレーズと提供された例があいまいであるため、この回答はOPの実際の問題を解決できない可能性があります。

バッファリングを避けるために、大容量ファイルの場合は、二重配信方式が役に立ちます。標準構文を使用しているため、移植性に優れています。

awk 'NR==FNR{next} {printf "%d %s\n",(NR-2*FNR+1),$0}' input_file input_file

これによりファイルは2回処理されます(したがって引数として2回提供されます)。

  • 最初のパスでは、ファイルごとのラインカウンタはグローバルラインFNRカウンタと同じで、何も実行せずに(=実行のためにすぐにそのラインにジャンプ)、ラインカウンタを自動的にインクリメントします。NRnext
  • 2番目のパス(FNR現在は異なるNR)で逆行数をNR(処理された行の総数、入力ファイルの総行数に現在の行数を加えた値)減算の2倍FNR(1回)として計算します。ファイルの長さに短くして実際にカウントダウンするには1回追加し、それ以外の場合は最後の行の行番号を取得し、それを使用して0printfの前に追加します。

答え3

使用awk

$ awk '{ a[i++]=NR" "$0 } END { for (n=i-1;n>=0;) print a[n--] }' input_file

答え4

次の入力例では:

one
two
three

入力ファイルが現在持っている使用可能なメモリ量に収まるほど小さく、行の順序も維持したい場合は、次のようにします。

awk '{ data[NR]=$0 } 
END{ 
    for(recNr=NR; recNr>0; recNr--)
        print recNr, data[++c]
}' infile

出力:

3 one
2 two
1 three

あるいは、入力ラインの順序を変更したい場合も同様です。

awk '{ data[NR]=$0 } 
END{ 
    for(recNr=NR; recNr>0; recNr--)
        print recNr, data[recNr]
}' infile

出力:

3 three
2 two
1 one

関連情報