7 ответов:
разрез может занять несколько диапазонов в
-f:столбцы до 4 и от 7 и далее:
cut -f -4,7-или для полей 1,2,5,6 и от 10 и далее:
cut -f 1,2,5,6,10-etc
чтобы использовать AWK для отсечения первого и последнего полей:
awk '{ = ""; $NF = ""; print}' inputfileк сожалению, это оставляет разделители поля, так что
aaa bbb cccстановится
[space]bbb[space]чтобы сделать это, используя ответ Куруми, который не оставит лишних пробелов, но таким образом, который специфичен для ваших требований:
awk '{delim = ""; for (i=2;i<=NF-1;i++) {printf delim "%s", $i; delim = OFS}; printf "\n"}' inputfileЭто также устраняет несколько проблем в ответ.
обобщить, что:
awk -v skipstart=1 -v skipend=1 '{delim = ""; for (i=skipstart+1;i<=NF-skipend;i++) {printf delim "%s", $i; delim = OFS}; printf "\n"}' inputfileзатем вы можете изменить количество поля, которые нужно пропустить в начале или в конце, изменив назначения переменных в начале команды.
вы можете использовать Bash для этого:
while read -a cols; do echo ${cols[@]:0:1} ${cols[@]:1,-1}; done < file.txt
вы можете вырезать, используя следующие,
- D: разделитель, - f для полей
\t используется для полей, разделенных вкладкамиcut -d$'\t' -f 1-3,7-
первая часть вашего вопроса-это просто. Как уже указывалось, 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 столбцы (независимо от их индексов в общей строке)" (т. е. потому, что вы не обязательно знаете, сколько столбцов вы найдете заранее), то, к сожалению, это невозможно выполнить с помощью . Для того, чтобы эффективно использовать
cutto вытащите " последний 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
вы можете использовать awk, например, отрезать 1-й, 2-й и последние 3 столбца
awk '{for(i=3;i<=NF-3;i++} print $i}' fileЕсли у вас есть язык программирования, таких как Ruby (1.9+)
$ ruby -F"\t" -ane 'print $F[2..-3].join("\t")' file
Comments