it-swarm.com.ru

Как напечатать третий столбец до последнего столбца?

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

94
Amit G

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

93
Marcin
awk '{for(i=3;i<=NF;++i)print $i}' 
95
Jonathan Feinberg
awk '{ print substr($0, index($0,$3)) }'

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

89
daisaa

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

awk '{for (i=1; i<=NF-2; i++) $i = $(i+2); NF-=2; print}' logfile
31
Dennis Williamson
awk '{$1=$2=$3=""}1' file

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

16
ghostdog74
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 внутри строк.

8
Robert Vila

Если вы хотите напечатать столбцы после 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

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

5
Brother

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

awk '{$ 1 = $ 2 = $ 3 = ""; распечатать файл

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

awk '/ ^ exim4-config/{$ 1 = ""; распечатать файл
5
Wawrzek

Следующая команда 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
4
funk

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

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

Perl решение:

Perl -lane 'splice @F,0,2; print join " ",@F' file

Эти параметры командной строки используются:

  • -n цикл вокруг каждой строки входного файла, не печатать автоматически каждую строку

  • -l удаляет новые строки перед обработкой и добавляет их обратно после

  • Режим автоматического разделения -a - разбивает входные строки в массив @F. По умолчанию расщепление по пробелам

  • -e выполнить код Perl

splice @F,0,2 удаляет столбцы 0 и 1 из массива @F

join " ",@F соединяет элементы массива @F, используя пробел между каждым элементом

Если ваш входной файл разделен запятыми, а не пробелами, используйте -F, -lane


Решение Python:

python -c "import sys;[sys.stdout.write(' '.join(line.split()[2:]) + '\n') for line in sys.stdin]" < file

2
Chris Koknat
awk '{a=match($0, $3); print substr($0,a)}'

Сначала вы найдете позицию начала третьего столбца. С помощью substr вы напечатаете всю строку ($ 0), начиная с позиции (в данном случае a) до конца строки. 

2
Mitchjol

В Bash вы можете использовать следующий синтаксис с позиционными параметрами:

while read -a cols; do echo ${cols[@]:2}; done < file.txt

Узнайте больше: Обработка позиционных параметров на Bash Hackers Wiki

1
kenorb
awk '{for (i=4; i<=NF; i++)printf("%c", $i); printf("\n");}'

печатает записи, начиная с 4-го поля до последнего поля в том же порядке, в котором они были в исходном файле

1
Massimo

Здесь немного поздно, но ничего из вышеперечисленного, похоже, не сработало. Попробуйте это, используя printf, вставляя пробелы между каждым. Я решил не иметь новой строки в конце.

awk '{for(i=3;i<=NF;++i) printf("%s ",  $i) }'
1
Ross
awk '{$1=$2=""}1' FILENAME | sed 's/\s\+//g'

Первые два столбца очищаются, sed удаляет начальные пробелы.

0
sjas

Если речь идет только о игнорировании первых двух полей и если вам не нужен пробел при маскировке этих полей (как это делают некоторые из приведенных выше ответов):

awk '{gsub($1" "$2" ",""); print;}' file
0
champost