2015-11-08 6 views
0

В настоящее время мы изучаем некоторые команды awk для манипулирования/изменения текста в файлах.Linux - переверните только последние нижние строки, с awk

наш оригинальный текст идет как this..1998

Ford,mondeo,1998,5800 
    ford,fiesta,1994,4575 
    Chevy,impala,1998,1000 
    Plymouth,Fury,1992,2000 
    Dodge,charger,1989,5950 
    Ford,F150,1991,1450 

Он просит нас переставить столбцы (часть один), которые я уже сделал .. , но в то же время, чтобы перевернуть две нижние строки (часть два), так что она выглядит как этого

1998 5800 Ford mondeo 
1994 4575 ford fiesta 
1998 1000 Chevy impala 
1992 2000 Plymouth Fury 
1991 1450 Ford F150 
1989 5950 Dodge charger 

снова, я получил заказ и расстояние между ними заботятся, но как я переключаю две нижних строк (или переворачивать их). кстати, это можно сделать только с awk.

+3

Пожалуйста, вы можете отредактировать почту ваш включить код, который показывает, что вы пробовали? – jayant

ответ

3

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

awk '{array[NR%3]=$0; 
    if(NR>2){print array[(NR+1)%3]}} 
    END{print array[NR%3]; 
     print array[(NR-1)%3]}' test 

Чтобы сделать это, мы сохраняем последние три строки в массиве. Мы печатаем строку только тогда, когда строка после следующей строки считывается. Наконец, мы берем последние две строки из массива, инвертируем порядок и печатаем его.

Более подробное описание кода:
Мы хранить содержимое текущей строки ($0) в массиве. Поскольку нам нужно отслеживать только последние три строки, индекс нашего массива может быть ограничен значениями 0, 1 и 2. Мы достигаем этого, используя оператор modulo (NR % 3).
При достижении третьей линии мы печатаем последнюю, но одну строку (if(NR>2)...). Это сохраняется, так как в этом случае в массиве еще есть две строки, которые мы можем обрабатывать отдельно.
Когда конец файла достигнут (END{...}), мы печатаем последние две строки в обратном порядке.
Почему мы использовали NR%3 (а не NR%2)? Если в нашем входном файле было всего две строки, печать должна произойти в END -блоке, а не раньше!

+0

Это правильный способ сделать это, и просто добавьте 'awk -F, '{$ 0 = $ 3" ​​"$ 4" "$ 1" "$ 2}' на передний план и вы решите часть переформатирования столбца вашего вопроса слишком. –

+0

Это работало, как шарм !, однако, относительный новый для awk, не могли бы вы объяснить каждую строку, пожалуйста ?, например, модуль 3, почему вы делите на 3 ?, и в чем смысл установки a = NR? – user1986245

+0

@ user1986245: Я добавил более подробное объяснение в свой ответ. Надеюсь, это поможет вам. –

1

это будет поменять местами две последние строки и печатает опущенные для других

$ tac cars | awk 'NR==1{getline one} 
        NR==2{print; print one} 
        NR>2{print "omitted"}' | tac 
omitted 
omitted 
omitted 
Plymouth,Fury,1992,2000 
Dodge,charger,1989,5950 

Вы можете добавить форматирование. Аналогичным образом может быть без tac с логикой в ​​блоке END.

UPDATE: AWK единственное решение: сохранить две строки в памяти, когда сделано печатать их в обратном порядке

$ awk 'NR>2{print pp} 
      {pp=p;p=$0} 
     END{print p;print pp}' car 

Ford,mondeo,1998,5800                       
ford,fiesta,1994,4575                       
Chevy,impala,1998,1000                       
Plymouth,Fury,1992,2000                       
Ford,F150,1991,1450                        
Dodge,charger,1989,5950  
+0

пропущено на самом деле не является частью окончательного результата .. Я просто набрал пропущенный, чтобы не писать первые 4 строки .. но окончательный результат должен действительно должен понравиться (см. Редактирование на пост) .. Кстати, мы не может использовать ничего, кроме AWK. – user1986245

 Смежные вопросы

  • Нет связанных вопросов^_^