Как распечатать все столбцы после определенного номера с помощью awk?

В оболочке я подключаюсь к awk, когда мне нужен конкретный столбец.

Отправляет столбец 9, например:

... | awk '{print $9}'

Как я могу сказать awk распечатать все столбцы , включая и после столбца 9, а не только столбец 9?

Ответ 1

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

Ответ 2

Если вы хотите сделать диапазон полей, awk на самом деле не имеет прямого способа сделать это. Вместо этого я бы рекомендовал cut:

cut -d' ' -f 9- ./infile

Изменить

Добавлен разделитель поля пространства по умолчанию, являющийся вкладкой. Спасибо Гленну за это.

Ответ 3

awk '{print substr($0, index($0,$9))}'

Edit: Обратите внимание, что это не работает, если любое поле до девятого содержит то же значение, что и девятое.

Ответ 4

sed -re 's,\s+, ,g' | cut -d ' ' -f 9-

Вместо того, чтобы иметь дело с пробелом переменной ширины, замените все пробелы как единое пространство. Затем используйте простые cut с интересующими полями.

Он не использует awk, поэтому не является родным, но кажется подходящим, учитывая другие ответы/комментарии.

Ответ 5

Обычно perl заменяет awk/sed/grep et. al., и гораздо более портативен (а также просто быть лучшим перочинным ножом).

perl -lane 'print "@F[8..$#F]"'

Timtowtdi применяется, конечно.

Ответ 6

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

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

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

fromField () { 
awk -v m="\x01" -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 = 0 он возвращает всю строку, как есть, и для n > NF пустая строка

Ответ 7

ruby -lane 'print $F[3..-1].join(" ")' file

Ответ 8

Чтобы отобразить первые 3 поля и распечатать оставшиеся поля, вы можете использовать:

awk '{s = ""; for (i=4; i<= NF; i++) s= s $i : "; print $1 $2 $3 s}' filename

где $1 $2 $3 - первые 3 поля.

Ответ 9

Вот пример вывода ls -l:

[email protected] 1 ricky.john  1493847943   5610048 Apr 16 14:09 00-Welcome.mp4
[email protected] 1 ricky.john  1493847943  27862521 Apr 16 14:09 01-Hello World.mp4
[email protected] 1 ricky.john  1493847943  21262056 Apr 16 14:09 02-Typical Go Directory Structure.mp4
[email protected] 1 ricky.john  1493847943  10627144 Apr 16 14:09 03-Where to Get Help.mp4

Мое решение напечатать что-либо сообщение $9 есть awk '{print substr($0, 61, 50)}'

Ответ 10

function print_fields(field_num1, field_num2){
    input_line = $0

    j = 1;
    for (i=field_num1; i <= field_num2; i++){
        $(j++) = $(i);

    }
    NF = field_num2 - field_num1 + 1;
    print $0

    $0 = input_line
}

Ответ 11

Использование cut вместо awk и преодоление проблем с определением, с какого столбца начинать, используя команду вырезания символа -c.

Здесь я говорю, дай мне все, кроме первых 49 символов вывода.

 ls -l /some/path/*/* | cut -c 50-

/*/*/ в конце команды ls говорит, покажи мне, что находится в подкаталогах.

Вы также можете вытащить определенные диапазоны символов аля (из справочной страницы cut). Например, показать имена и время входа в систему в настоящее время вошедших в систему пользователей:

       who | cut -c 1-16,26-38