Подтвердить что ты не робот

Использование команды cut для удаления нескольких столбцов

с учетом ввода

 echo 1,2,3,4,5,6,7,8,9,...100 

Если я хочу вырезать столбцы 5, я могу сделать

cut -d, -f-4,6-

что, если я хочу разрезать несколько не последовательных столбцов, таких как 5, 7 и т.д. есть ли один вкладыш?

4b9b3361

Ответ 1

Вы должны быть в состоянии продолжить последовательности непосредственно в вашей существующей спецификации -f.

Чтобы пропустить 5 и 7, попробуйте:

cut -d, -f-4,6-6,8-

Поскольку вы пропускаете один последовательный столбец, это также можно записать так:

cut -d, -f-4,6,8-

Чтобы продолжить, если вы хотите пропустить 5, 7 и 11, вы должны использовать:

cut -d, -f-4,6-6,8-10,12-

Чтобы представить его в более четкой перспективе, проще визуализировать, когда вы используете начальный/конечный столбцы, которые идут в начале/конце списка последовательностей соответственно. Например, следующее напечатает столбцы со 2 по 20, пропуская столбцы 5 и 11:

cut -d, -f2-4,6-10,12-20

Таким образом, будет напечатано "2–4", пропущено 5, "6–10", "11", а затем "12–20".

Ответ 2

Иногда легче думать о том, какие поля исключать.

Если количество полей, которые не режутся (не сохраняются на выходе), невелико, может быть проще использовать флаг --complement, например. включить все поля 1-20, кроме 3, 7 и 12 - сделать это:

cut -d, --complement -f3,7,12 <inputfile

Вместо

cut -d, -f-2,4-6,8-11,13-

Ответ 3

Вы можете разрезать все столбцы нечетные/четные, используя seq:

Это будет печатать все нечетные столбцы

echo 1,2,3,4,5,6,7,8,9,10 | cut -d, -f$(seq -s, 1 2 10)

Чтобы напечатать все четные столбцы, вы можете использовать

echo 1,2,3,4,5,6,7,8,9,10 | cut -d, -f$(seq -s, 2 2 10)

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

Если спецификация, в которой столбцы для печати более сложны, вы также можете использовать "однострочное-if-предложение", например

echo 1,2,3,4,5,6,7,8,9,10 | cut -d, -f$(for i in $(seq 1 10); do if [[ $i -lt 10 && $i -lt 5 ]];then echo -n $i,; else echo -n $i;fi;done)

Это будет печатать все столбцы от 1 до 5 - вы можете просто изменить условия для создания более сложных условий для указания погоды, в которой должен быть напечатан столбец.

Ответ 4

То же самое можно сделать с Perl
Поскольку он использует индексирование на основе 0 вместо индексирования на основе 1, значения полей смещаются на 1

perl -F, -lane 'print join ",", @F[1..3,5..9,11..19]'    

эквивалентно:

cut -d, -f2-4,6-10,12-20

Если запятые не нужны в выводе:

perl -F, -lane 'print "@F[1..3,5..9,11..19]"'