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

У меня есть большой файл с несколькими столбцами с # числом записей (строк). Как я могу применить только команду awk в последней записи или любом конкретном номере записей ( ig NR == 4) или диапазон строк (NR == [2-5])?

в качестве примера в следующем файле:

  • Уничтожение запущенного процесса на машине Ubuntu удаленно с Windows-машины, находящейся в локальной сети
  • Предполагается, что «userdel -root?»
  • Какой файл кэширует подсистемы?
  • Экран дрожит / качается в Debian 8.1
  • HP ProLiant DL320e G8 v2 - установите CentOS или сервер Ubuntu
  • Перемещение строк 2 3 после строки 5 с помощью awk
  •  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, чтобы применить это только в последней строке или к каким-либо конкретным номерам строк?

  • Awk, результат печати
  • Замена значений в одном файле значениями в другом файле в bash
  • Сравнение первого столбца в разных файлах
  • Ввод m файлов в каталог в n tar-файлов по размеру?
  • Как отключить звуковой сигнал в командной строке Linux CentOS 7?
  • Как удалить конечные пробелы в конце строки в заданных файлах (более одного)?
  • 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)
    Linux и Unix - лучшая ОС в мире.