Как вырезать первые n и последние n столбцов? - PullRequest
65 голосов
/ 10 февраля 2011

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

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

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

Ответы [ 7 ]

96 голосов
/ 10 февраля 2011

Вырезать может принимать несколько диапазонов в -f:

Столбцы до 4 и от 7 и далее:

cut -f -4,7-

или для полей 1,2,5,6 и от 10и далее:

cut -f 1,2,5,6,10-

и т. д.

1 голос
/ 10 февраля 2011

Чтобы использовать AWK для обрезания первого и последнего полей:

awk '{$1 = ""; $NF = ""; print}' inputfile

К сожалению, это оставляет разделители полей, поэтому

aaa bbb ccc

становится

[space]bbb[space]

Чтобы сделать это, используя ответ kurumi, который не оставит лишних пробелов, но в соответствии с вашими требованиями:

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

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

0 голосов
/ 24 июня 2018

Первая часть вашего вопроса проста.Как уже указывалось, 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
0 голосов
/ 10 марта 2018

Вы можете вырезать, используя следующее,
-d: разделитель, -f для полей
\ t используется для полей, разделенных табуляцией

cut -d$'\t' -f 1-3,7-
0 голосов
/ 10 апреля 2016

Вы можете использовать Bash для этого:

while read -a cols; do echo ${cols[@]:0:1} ${cols[@]:1,-1}; done < file.txt
0 голосов
/ 25 января 2013

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

echo a#b#c | awk -F"#" '{$1 = ""; $NF = ""; print}' OFS=""
0 голосов
/ 10 февраля 2011

вы можете использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...