Как напечатать третий столбец до последнего столбца? - PullRequest
103 голосов
/ 21 октября 2009

Я пытаюсь удалить первые два столбца (которые меня не интересуют) из файла журнала DbgView. Я не могу найти пример, который печатает от столбца 3 и далее до конца строки. Обратите внимание, что каждая строка имеет переменное количество столбцов.

Ответы [ 18 ]

99 голосов
/ 21 октября 2009

... или более простое решение: cut -f 3- INPUTFILE просто добавьте правильный разделитель (-d), и вы получите тот же эффект.

98 голосов
/ 21 октября 2009
awk '{for(i=3;i<=NF;++i)print $i}' 
92 голосов
/ 09 июля 2011
awk '{ print substr($0, index($0,$3)) }'

решение найдено здесь:
http://www.linuxquestions.org/questions/linux-newbie-8/awk-print-field-to-end-and-character-count-179078/

32 голосов
/ 21 октября 2009

Ответ Джонатана Фейнберга выводит каждое поле на отдельной строке. Вы можете использовать printf, чтобы перестроить запись для вывода на той же строке, но вы также можете просто переместить поля на прыжок влево.

awk '{for (i=1; i<=NF-2; i++) $i = $(i+2); NF-=2; print}' logfile
16 голосов
/ 24 октября 2009
awk '{$1=$2=$3=""}1' file

Примечание: этот метод оставит пробелы в 1,2,3 полях, но не проблема, если вы просто хотите посмотреть на вывод.

8 голосов
/ 16 апреля 2014
awk -v m="\x0a" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'

Это прерывает то, что перед заданным полем nr., N, и печатает всю оставшуюся часть строки, включая поле nr.N и поддерживая исходный интервал (он не форматируется) Не имеет значения, если строка поля появляется также где-то еще в строке, что является проблемой с ответом daisaa.

Определить функцию:

fromField () { 
awk -v m="\x0a" -v N="$1" '{$N=m$N; print substr($0,index($0,m)+1)}'
}

И используйте это так:

$ echo "  bat   bi       iru   lau bost   " | fromField 3
iru   lau bost   
$ echo "  bat   bi       iru   lau bost   " | fromField 2
bi       iru   lau bost 

Выход поддерживает все, включая конечные пробелы

Хорошо работает для файлов, где '/ n' является разделителем записей, поэтому у вас нет этого символа новой строки внутри строк. Если вы хотите использовать его с другими разделителями записей, используйте:

awk -v m="\x01" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'

например. Хорошо работает почти со всеми файлами, если они не используют шестнадцатеричный символ номер. 1 внутри строк.

5 голосов
/ 01 июня 2011

А как насчет следующей строки:

awk '{$1=$2=$3=""; print}' file

Основано на предложении @ ghostdog74. Мой должен вести себя лучше, когда вы фильтруете линии, т.е.

awk '/^exim4-config/ {$1=""; print }' file
5 голосов
/ 06 марта 2018

Если вы хотите напечатать столбцы после 3-го, например, в той же строке, вы можете использовать:

awk '{for(i=3; i<=NF; ++i) printf "%s ", $i; print ""}'

Например:

Mar 09:39 20180301_123131.jpg
Mar 13:28 20180301_124304.jpg
Mar 13:35 20180301_124358.jpg
Feb 09:45 Cisco_WebEx_Add-On.dmg
Feb 12:49 Docker.dmg
Feb 09:04 Grammarly.dmg
Feb 09:20 Payslip 10459 %2828-02-2018%29.pdf

Будет напечатано:

20180301_123131.jpg
20180301_124304.jpg
20180301_124358.jpg
Cisco_WebEx_Add-On.dmg
Docker.dmg
Grammarly.dmg
Payslip 10459 %2828-02-2018%29.pdf

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

4 голосов
/ 08 декабря 2014

Следующая команда awk печатает последние N полей каждой строки, а в конце строки печатает символ новой строки:

awk '{for( i=6; i<=NF; i++ ){printf( "%s ", $i )}; printf( "\n"); }'

Найдите ниже пример, который перечисляет содержимое каталога / usr / bin, а затем содержит последние 3 строки и затем печатает последние 4 столбца каждой строки, используя awk:

$ ls -ltr /usr/bin/ | tail -3
-rwxr-xr-x 1 root root       14736 Jan 14  2014 bcomps
-rwxr-xr-x 1 root root       10480 Jan 14  2014 acyclic
-rwxr-xr-x 1 root root    35868448 May 22  2014 skype

$ ls -ltr /usr/bin/ | tail -3 | awk '{for( i=6; i<=NF; i++ ){printf( "%s ", $i )}; printf( "\n"); }'
Jan 14 2014 bcomps 
Jan 14 2014 acyclic 
May 22 2014 skype
3 голосов
/ 21 октября 2009

Ну, вы можете легко добиться того же эффекта, используя регулярное выражение. Предполагая, что разделитель является пробелом, он будет выглядеть так:

awk '{ sub(/[^ ]+ +[^ ]+ +/, ""); print }'
...