Linux

如何使用 awk 命令僅編輯最後一行(或任何特定的行號)?

  • December 11, 2019

我有一個大的多列文件,其中有 #n 條記錄(行)。我如何只能awk在最後一條記錄或任何特定記錄號(ig NR==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 僅在最後一行或任何特定的行號中應用它?

當 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 行。

進一步閱讀:

引用自:https://unix.stackexchange.com/questions/332028