Ответ 1
Если данные однозначно разделены на вкладку, то cut
будет вырезать вкладки, а не пробелы:
cut -f7 filename
Вы также можете сделать это с помощью awk
:
awk -F'\t' '{ print $7 }'
У меня есть требование выбрать 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
Если данные однозначно разделены на вкладку, то cut
будет вырезать вкладки, а не пробелы:
cut -f7 filename
Вы также можете сделать это с помощью awk
:
awk -F'\t' '{ print $7 }'
Если поля разделены вкладками, и ваша проблема в том, что некоторые поля содержат пробелы, здесь нет проблем, просто:
cut -f 7
(по умолчанию по умолчанию заданы поля с разделителями табуляции.)
Судя по формату вашего входного файла, вы можете уйти с ограничением на -
вместо пробелов:
awk 'BEGIN{FS="-"} {print $2}' filename
FS
означает полевой разделитель, просто подумайте об этом как разделитель для ввода.-
, ваше 7-е поле до этого становится вторым.filename
в качестве аргумента для awk.В качестве альтернативы, если ваши поля данных разделены вкладками, вы можете сделать это более явно следующим образом:
awk 'BEGIN{FS="\t"} {print $7}' filename
И это решит проблему, поскольку Out Global Doc Mark
выглядит разделенным пробелами.
Это может сработать для вас (GNU sed):
sed -r 's/(([^\t]*)\t?){7}.*/\2/' file
Эта команда substitute выбирает все в строке и возвращает 7-ю не-вкладку. В sed
последнее слово, сгруппированное по (...)
, будет возвращено в левой части подстановки с использованием обратной ссылки. В этом случае первая обратная ссылка вернет оба символа без табуляции и символ табуляции (если имеется NB метатег ?
, который либо один, либо ни один из шаблона продолжения). .*
просто поглощает то, что был оставлен на линии, если таковой имеется.