#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行を選択します。
追加資料:
- awkの表現(POSIX)