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

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

Ответ 1

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

Ответ 2

awk '{for(i=3;i<=NF;++i)print $i}' 

Ответ 4

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

awk '{for (i=1; i<=NF-2; i++) $i = $(i+2); NF-=2; print}' logfile

Ответ 5

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

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

Ответ 6

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' является разделителем записей, поэтому у вас нет этой новой строки char внутри строк. Если вы хотите использовать его с другими разделителями записей, используйте:

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

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

Ответ 7

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

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

Ответ 8

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

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

На основе предложения @ghostdog74. Шахта должна вести себя лучше при фильтрации линий, т.е.:

awk '/^exim4-config/ {$1=""; print }' file

Ответ 9

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

Ответ 10

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

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

Ответ 11

Решение 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

Ответ 12

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

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

Ответ 13

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

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

Ответ 14

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

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

Ответ 15

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

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

Подробнее: Обработка позиционных параметров в Bash Hackers Wiki

Ответ 16

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

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

Ответ 17

awk '{$1=$2=""}1' FILENAME | sed 's/\s\+//g'

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

Ответ 18

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

Ответ 19

В столбцах AWK называются поля, поэтому NF является ключом

все строки:

awk -F '<column separator>' '{print $(NF-2)}' <filename>

только первая строка:

awk -F '<column separator>' 'NR<=1{print $(NF-2)}' <filename>