Первая часть вашего вопроса проста.Как уже указывалось, cut допускает пропуск начального или конечного индекса диапазона столбца, интерпретируя это как значение «от начала до столбца n (включительно)» или «от столбца n (включительно) до конца »соответственно:
$ printf 'this:is:a:test' | cut -d: -f-2
this:is
$ printf 'this:is:a:test' | cut -d: -f3-
a:test
Также поддерживается объединение диапазонов.Если вы хотите, например, первые 3 и последние 2 столбца в строке из 7 столбцов:
$ printf 'foo:bar:baz:qux:quz:quux:quuz' | cut -d: -f-3,6-
foo:bar:baz:quux:quuz
Однако, вторая часть вашего вопроса может быть немного сложнее в зависимостина какой вклад вы ожидаете.Если под «последними n столбцами» вы подразумеваете «последние n столбцов (независимо от их индексов в общей строке)» (т. Е. Потому что вы не обязательно знаете, сколько столбцов у вас »Вы найдете заранее), к сожалению, это невозможно сделать, используя только cut
.Чтобы эффективно использовать cut
для извлечения «последних n столбцов» в каждой строке, общее количество столбцов, присутствующих в каждой строке, должно быть известно заранее, и каждая строка должна соответствовать количеству содержащихся в ней столбцов.
Если вы не знаете, сколько «столбцов» может присутствовать в каждомстрока (например, потому что вы работаете с вводом, который не является строго табличным), тогда вам придется использовать что-то вроде awk
.Например, чтобы использовать awk
для извлечения последних 2 «столбцов» (awk называет их полями, количество которых может варьироваться в каждой строке) из каждой строки ввода:
$ printf '/a\n/a/b\n/a/b/c\n/a/b/c/d\n' | awk -F/ '{print $(NF-1) FS $(NF)}'
/a
a/b
b/c
c/d