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

StackOverflow https://stackoverflow.com/questions/1602035

Вопрос

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

Это было полезно?

Решение

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

Другие советы

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

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

В ответе

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

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

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

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

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

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

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

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

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

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

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

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

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

Перл-решение:

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

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

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

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

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

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

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

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

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

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

awk '{gsub($1" "$2" ",""); print;}' file
awk '{$1=$2=""}1' FILENAME | sed 's/\s\+//g'

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

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

все строки:

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

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

awk -F '<column separator>' 'NR<=1{print $(NF-2)}' <filename>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top