Распечатать все, кроме первых трех столбцов - PullRequest
109 голосов
/ 13 апреля 2010

Слишком громоздко:

awk '{print " "$4" "$5" "$6" "$7" "$8" "$9" "$10" "$11" "$12" "$13}' things

Ответы [ 19 ]

3 голосов
/ 29 мая 2013

Другой способ избежать использования оператора print:

 $ awk '{$1=$2=$3=""}sub("^"FS"*","")' file

В awk, когда условие выполняется, печать является действием по умолчанию.

1 голос
/ 23 октября 2015

Cut имеет флаг --complement, который позволяет легко (и быстро) удалять столбцы. Результирующий синтаксис аналогичен тому, что вы хотите сделать - облегчить чтение / понимание решения Дополнение также работает для случая, когда вы хотите удалить несмежные столбцы.

$ foo='1 2 3 %s 5 6 7'
$ echo "$foo" | cut --complement -d' ' -f1-3
%s 5 6 7
$
1 голос
/ 09 сентября 2015

Perl-решение, которое не добавляет начальные или конечные пробелы:

perl -lane 'splice @F,0,3; print join " ",@F' file

Массив perl @F autosplit начинается с индекса 0, а поля awk начинаются с $1


Решение Perl для данных, разделенных запятыми:

perl -F, -lane 'splice @F,0,3; print join ",",@F' file

Решение Python:

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

0 голосов
/ 22 октября 2018

Я нашел эту другую возможность, может быть, она также может быть полезна ...

awk 'BEGIN {OFS=ORS="\t" }; {for(i=1; i<14; i++) print $i " "; print $NF "\n" }' your_file

Примечание: 1. Для табличных данных и от столбца $ 1 до 14

0 голосов
/ 14 мая 2017

Для меня наиболее компактным и послушным решением является

$ a='1   2\t \t3     4   5   6 7 \t 8\t '; 
$ echo -e "$a" | awk -v n=3 '{while (i<n) {i++; sub($1 FS"*", "")}; print $0}'

И если у вас есть больше строк для обработки, например, файла foo.txt , не забудьте сбросить i в 0:

$ awk -v n=3 '{i=0; while (i<n) {i++; sub($1 FS"*", "")}; print $0}' foo.txt

Спасибо вашему форуму.

0 голосов
/ 15 июня 2018

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

У меня есть журнал, где после 5 долларов с IP-адресом может быть больше текста или нет текста. Мне нужно все, от IP-адреса до конца строки, если что-то будет после 5 долларов. В моем случае это на самом деле в программе awk, а не в awk oneliner, поэтому awk должен решить проблему. Когда я пытаюсь удалить первые 4 поля, используя старый симпатичный и самый голосующий, но совершенно неправильный ответ:

echo "  7 27.10.16. Thu 11:57:18 37.244.182.218 one two three" | awk '{$1=$2=$3=$4=""; printf "[%s]\n", $0}'

выдает неправильный и бесполезный ответ (я добавил [] для демонстрации):

[    37.244.182.218 one two three]

Вместо этого, если столбцы имеют фиксированную ширину до точки среза и awk, правильный и довольно простой ответ:

echo "  7 27.10.16. Thu 11:57:18 37.244.182.218 one two three" | awk '{printf "[%s]\n", substr($0,28)}'

, который выдает желаемый результат:

[37.244.182.218 one two three]
0 голосов
/ 22 сентября 2013

Это не очень далеко от некоторых предыдущих ответов, но решает пару вопросов:

cols.sh * * 1004

#!/bin/bash
awk -v s=$1 '{for(i=s; i<=NF;i++) printf "%-5s", $i; print "" }'

Который теперь можно вызывать с аргументом, который будет начальным столбцом:

$ echo "1 2 3 4 5 6 7 8 9 10 11 12 13 14" | ./cols.sh 3 
3    4    5    6    7    8    9    10   11   12   13   14

Или:

$ echo "1 2 3 4 5 6 7 8 9 10 11 12 13 14" | ./cols.sh 7 
7    8    9    10   11   12   13   14

Это 1-индексированный; если вы предпочитаете индексировать ноль, используйте i=s + 1.

Более того, если вам нужны аргументы для начального индекса и конечного индекса, измените файл на:

#!/bin/bash
awk -v s=$1 -v e=$2 '{for(i=s; i<=e;i++) printf "%-5s", $i; print "" }'

Например:

$ echo "1 2 3 4 5 6 7 8 9 10 11 12 13 14" | ./cols.sh 7 9 
7    8    9

%-5s выравнивает результат в виде столбцов шириной 5 символов; если этого недостаточно, увеличьте число или используйте %s (с пробелом) вместо этого, если вас не интересует выравнивание.

0 голосов
/ 01 апреля 2019

Используйте вырезать:

cut -d <The character between characters> -f <number of first column>,<number of last column> <file name>

например: если у вас есть file1, содержащий: car.is.nice.equal.bmw

Выполнить: cut -d . -f1,3 file1 напечатает car.is.nice

0 голосов
/ 22 июня 2014

Решение на основе AWK printf, которое позволяет избежать проблемы% и уникально тем, что ничего не возвращает (без символа возврата), если для печати меньше 4 столбцов:

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

Тестирование:

$ x='1 2 3 %s 4 5 6'
$ echo "$x" | awk 'NF > 3 { for(i=4; i<NF; i++) printf("%s ", $(i)); print $(i) }'
%s 4 5 6
$ x='1 2 3'
$ echo "$x" | awk 'NF > 3 { for(i=4; i<NF; i++) printf("%s ", $(i)); print $(i) }'
$ x='1 2 3 '
$ echo "$x" | awk 'NF > 3 { for(i=4; i<NF; i++) printf("%s ", $(i)); print $(i) }'
$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...