awkを使用してファイルの2番目から最後の行を印刷する方法[duplicate]

awkを使用してファイルの2番目から最後の行を印刷する方法[duplicate]

それぞれ異なる番号または履歴を持つ複数のファイルがあります。 2番目から最後の行まで印刷し、いくつかの変更を行うawkコマンドが必要です。私は次のようなものが欲しい:(もちろんこれはうまくいきません)

awk '( NR == FNR-1 ), $0","' *.txt

答え1

awkレコードが来ると読んで、まだ読んでいない場合は最後からどれだけ離れているかはわかりません(現在のレコードを読んで処理した後に追加のレコードが追加される可能性が高い)。

代わりにsed、どちらが最後のレコードであってもわかりません(どちらが最後のレコードであるかを知るために、事前に1つのレコードを内部的に読み取り、実際にアドレスを持っています)sed$

ENDただし、特殊ステートメントの終わりまたは各入力ファイル(コマンドステートメント内)を処理した後、GNUを使用していくつかの処理を実行できます。awkENDFILE

したがって、処理中に最後の2つのレコードを保存してから、END/ステートメントENDFILEに保存した場所から2番目のレコードを呼び出すことができます。

たとえば、

awk '{prevlast = last; last = $0}
     END {if (NR >= 2) print "penultimate:", prevlast}' < input

または:

gawk '{prevlast = last; last = $0}
      ENDFILE {
       if (FNR >= 2) print "penultimate for", FILENAME ":", prevlast
      }' file1 file2

または最後からn番目に一般化します。

awk -v n=2 '{saved[NR % n] = $0}
     END {if (NR >= n) print saved[(NR + 1) % n]}' < input

gawk -v n=2 '{saved[FNR % n] = $0}
     ENDFILE {if (FNR >= n) print saved[(FNR + 1) % n]}' file1 file2

答え2

,2番目から最後の行の末尾にカンマを追加し、各ファイルをその場で変更します。

sed解決策:

サンプルfile1.txt:

C2-C1 1.5183
C3-C2 1.49
C3-C1 1.4991
O4-C3 1.4104
C1-C2-C3 59.78

サンプルfile2.txt:

C2-C1 1.5052
C3-C2 1.505
C3-C1 1.5037
S4-C3 1.7976
C1-C2-C3 59.95

sed -i 'x; ${s/.*/&,/;p;x}; 1d' file*.txt

結果を見る:

$ head file[12].txt
==> file1.txt <==
C2-C1 1.5183
C3-C2 1.49
C3-C1 1.4991
O4-C3 1.4104,
C1-C2-C3 59.78

==> file2.txt <==
C2-C1 1.5052
C3-C2 1.505
C3-C1 1.5037
S4-C3 1.7976,
C1-C2-C3 59.95

関連情報