awkコマンドを使用して最後の行(または特定の行番号)のみを編集するには?

awkコマンドを使用して最後の行(または特定の行番号)のみを編集するには?

#n個のレコード(行)を含む大きな複数列ファイルがあります。awk最後のレコードまたは特定のレコード番号にのみコマンドを適用するにはどうすればよいですか?IGNR==4) または行範囲(NR==[2-5])?

次のファイルの例を次に示します。

echo filename
30.5,2010/06/01,2016/08/29,2281.00,0006.25,0074.94
41.6,2008/03/05,2012/03/05,1461.00,0004.00,0048.00
39.6,2008/03/05,2012/09/10,1649.96,0004.52,0054.21
41.0,2008/03/05,2013/09/16,2020.96,0005.53,0066.40
42.2,2008/03/05,2014/03/18,2203.96,0006.03,0072.41
41.1,2008/03/05,2014/09/16,2385.96,0006.53,0078.39
43.1,2008/05/08,2014/09/16,/2322.00,/0006.36,/0076.29

日付を除くすべてのフィールドを削除するには、次のawkスクリプトを適用しました/

nawk -F, -v OFS=,  '{split($4,a,"/"); $4=sprintf("%06.2f", a[2]);split ($5,b,"/");$5=sprintf("%06.2f", b[2]);split($6,c,"/");$6=sprintf("%06.2f", c[2]); print $0}' filename 

最後の行には適していますが、そうでない他の行には負の影響があります/。次の出力:

output

30.5,2010/06/01,2016/08/29,000.00,000.00,000.00
41.6,2008/03/05,2012/03/05,000.00,000.00,000.00
39.6,2008/03/05,2012/09/10,000.00,000.00,000.00
41.0,2008/03/05,2013/09/16,000.00,000.00,000.00
42.2,2008/03/05,2014/03/18,000.00,000.00,000.00
41.1,2008/03/05,2014/09/16,000.00,000.00,000.00
43.1,2008/05/08,2014/09/16,2322.00,006.36,076.29


however, the expected correct output should be :

30.5,2010/06/01,2016/08/29,2281.00,0006.25,0074.94
41.6,2008/03/05,2012/03/05,1461.00,0004.00,0048.00
39.6,2008/03/05,2012/09/10,1649.96,0004.52,0054.21
41.0,2008/03/05,2013/09/16,2020.96,0005.53,0066.40
42.2,2008/03/05,2014/03/18,2203.96,0006.03,0072.41
41.1,2008/03/05,2014/09/16,2385.96,0006.53,0078.39
43.1,2008/05/08,2014/09/16,2322.00,0006.36,0076.29

それでは、最後の行または特定の行番号にのみ適用するようにawkにどのように指示しますか?

答え1

awkがファイルを処理するときの変数NR処理されたレコードの総数を示します。だからあなたは模様例えば

(NR == 5)

あなたの前に行動

{split($4,a,"/");...

例えば、

(NR == 5){split($4,a,"/");...

プロセスライン 5.

処理したい場合最後行のみ、その行をデフォルトのジョブとして保存できます。

{ save = $0; }

そのセクションでその行を処理しますEND。ただし、そこでフィールド分割を実行する必要があります($0これ以上適用できません)。

END {split(whatever,a,"/");...

範囲の場合、より複雑な式を使用できます。

( NR >= 2 && NR <= 5 )

2~5行を選択します。

追加資料:

関連情報