В оболочке я подключаюсь к awk, когда мне нужен конкретный столбец.
Отправляет столбец 9, например:
... | awk '{print $9}'
Как я могу сказать awk распечатать все столбцы , включая и после столбца 9, а не только столбец 9?
В оболочке я подключаюсь к awk, когда мне нужен конкретный столбец.
Отправляет столбец 9, например:
... | awk '{print $9}'
Как я могу сказать awk распечатать все столбцы , включая и после столбца 9, а не только столбец 9?
awk '{ s = ""; for (i = 9; i <= NF; i++) s = s $i " "; print s }'
Если вы хотите сделать диапазон полей, awk
на самом деле не имеет прямого способа сделать это. Вместо этого я бы рекомендовал cut
:
cut -d' ' -f 9- ./infile
Добавлен разделитель поля пространства по умолчанию, являющийся вкладкой. Спасибо Гленну за это.
awk '{print substr($0, index($0,$9))}'
Edit: Обратите внимание, что это не работает, если любое поле до девятого содержит то же значение, что и девятое.
sed -re 's,\s+, ,g' | cut -d ' ' -f 9-
Вместо того, чтобы иметь дело с пробелом переменной ширины, замените все пробелы как единое пространство. Затем используйте простые cut
с интересующими полями.
Он не использует awk, поэтому не является родным, но кажется подходящим, учитывая другие ответы/комментарии.
Обычно perl заменяет awk/sed/grep et. al., и гораздо более портативен (а также просто быть лучшим перочинным ножом).
perl -lane 'print "@F[8..$#F]"'
Timtowtdi применяется, конечно.
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 пустая строка
ruby -lane 'print $F[3..-1].join(" ")' file
Чтобы отобразить первые 3 поля и распечатать оставшиеся поля, вы можете использовать:
awk '{s = ""; for (i=4; i<= NF; i++) s= s $i : "; print $1 $2 $3 s}' filename
где $1 $2 $3 - первые 3 поля.
Вот пример вывода 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)}'
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
}
Использование cut вместо awk и преодоление проблем с определением, с какого столбца начинать, используя команду вырезания символа -c.
Здесь я говорю, дай мне все, кроме первых 49 символов вывода.
ls -l /some/path/*/* | cut -c 50-
/*/*/
в конце команды ls говорит, покажи мне, что находится в подкаталогах.
Вы также можете вытащить определенные диапазоны символов аля (из справочной страницы cut). Например, показать имена и время входа в систему в настоящее время вошедших в систему пользователей:
who | cut -c 1-16,26-38