Как вырезать первые n и последние N столбцов?



Как я могу отрезать первый n и последний n столбцы из файла с разделителями табуляции?



я попробовал это вырезать первым n. Но я понятия не имею, чтобы объединить первый и последний столбец n



cut -f 1-10 -d "<CTR>v <TAB>" filename
652   7  

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 столбцы (независимо от их индексов в общей строке)" (т. е. потому, что вы не обязательно знаете, сколько столбцов вы найдете заранее), то, к сожалению, это невозможно выполнить с помощью . Для того, чтобы эффективно использовать cut to вытащите " последний 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

попробуйте следующее:

echo a#b#c | awk -F"#" '{ = ""; $NF = ""; print}' OFS=""

Comments

    Ничего не найдено.