Подтвердить что ты не робот

Выберите конкретный столбец с помощью awk или cut или perl

У меня есть требование выбрать 7-й столбец из файла с разделителями табуляции. например:

cat filename | awk '{print $7}'

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

user  \Adminis FL_vol Design         0         -       1       -
group        0 FL_vol Design   19324481         -    3014       -
user      \MAK FL_vol Design   16875161         -    2618       -
tree       826 FL_vol Out Global Doc Mark     16875162         -    9618       - /vol/FL_vol/Out Global Doc Mark
4b9b3361

Ответ 1

Если данные однозначно разделены на вкладку, то cut будет вырезать вкладки, а не пробелы:

cut -f7 filename

Вы также можете сделать это с помощью awk:

awk -F'\t' '{ print $7 }'

Ответ 2

Если поля разделены вкладками, и ваша проблема в том, что некоторые поля содержат пробелы, здесь нет проблем, просто:

cut -f 7

(по умолчанию по умолчанию заданы поля с разделителями табуляции.)

Ответ 3

Судя по формату вашего входного файла, вы можете уйти с ограничением на - вместо пробелов:

awk 'BEGIN{FS="-"} {print $2}' filename
  • FS означает полевой разделитель, просто подумайте об этом как разделитель для ввода.
  • Учитывая, что мы теперь ограничиваем -, ваше 7-е поле до этого становится вторым.
  • Сохранить кошку! Укажите входной файл filename в качестве аргумента для awk.

В качестве альтернативы, если ваши поля данных разделены вкладками, вы можете сделать это более явно следующим образом:

awk 'BEGIN{FS="\t"} {print $7}' filename

И это решит проблему, поскольку Out Global Doc Mark выглядит разделенным пробелами.

Ответ 4

Это может сработать для вас (GNU sed):

sed -r 's/(([^\t]*)\t?){7}.*/\2/' file

Эта команда substitute выбирает все в строке и возвращает 7-ю не-вкладку. В sed последнее слово, сгруппированное по (...), будет возвращено в левой части подстановки с использованием обратной ссылки. В этом случае первая обратная ссылка вернет оба символа без табуляции и символ табуляции (если имеется NB метатег ?, который либо один, либо ни один из шаблона продолжения). .* просто поглощает то, что был оставлен на линии, если таковой имеется.