Как изменить только последнюю строку (или любые конкретные номера строк) с помощью команды awk?

У меня есть большой файл с несколькими столбцами с # числом записей (строк). Как я могу применить только команду 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 29,2281.00,0006.25,0074.94 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 05,1461.00,0004.00,0048.00 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 10,1649.96,0004.52,0054.21 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 16,2020.96,0005.53,0066.40 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 18,2203.96,0006.03,0072.41 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 16,2385.96,0006.53,0078.39 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 29,000.00,000.00,000.00 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 05,000.00,000.00,000.00 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 10,000.00,000.00,000.00 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 16,000.00,000.00,000.00 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 18,000.00,000.00,000.00 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 16,000.00,000.00,000.00 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 16,2322.00,006.36,076.29 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 29,2281.00,0006.25,0074.94 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 05,1461.00,0004.00,0048.00 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 10,1649.96,0004.52,0054.21 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 16,2020.96,0005.53,0066.40 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 18,2203.96,0006.03,0072.41 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 16,2385.96,0006.53,0078.39 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, чтобы применить это только в последней строке или к каким-либо конкретным номерам строк?

  • Замените данные в столбце в файле данными в строке из другого файла
  • Извлечение информации о трассировке с помощью gawk
  • awk найти строки с двумя совпадениями
  • Самый эффективный способ сделать полмиллиона операций математики ежечасно
  • Как использовать grep / awk / unix для соответствия всем строкам из одного файла в другом файле, даже если они дублируются
  • разбор нескольких полей csv с gawk на solaris
  • awk для обработки строк с нулями по столбцам
  • элементы доступа в строчном массиве - символ рассеяния @
  • One Solution collect form web for “Как изменить только последнюю строку (или любые конкретные номера строк) с помощью команды 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.

    Дальнейшее чтение:

    • выражения в awk (POSIX)
    Interesting Posts

    `du -sh` сообщает другой использованный размер, чем` df -h`

    VNC через маршрутизатор Raspberry Pi с использованием переадресации портов

    Программа для двусторонней синхронизации больших файлов (образы дисков VM)

    Есть ли способ для сценария оболочки узнать, какая программа его выполнила?

    В Solaris 7 Box пытается получить X-библиотеку расширений для работы с использованием x11vnc

    Получение пароля после редактирования файла sudoers в cent OS 7?

    Форматирование вывода сценария оболочки

    Ядро Linux, отсутствует символ «__fentry__»

    cd: разрешено: binutils-2.21.1

    Разрешение запрещено в скриптовой тюрьме chroot

    Бит-сдвиг файла

    Удалить строки, содержащие одну и ту же информацию, но в другом порядке

    Как использовать mutt для управления / var / spool / mail / user

    Как вызвать скрипт, используя другой скрипт, расположенный в другом каталоге

    Как использовать несколько параметров для grep (в режиме live)?

    Linux и Unix - лучшая ОС в мире.