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