с учетом ввода
echo 1,2,3,4,5,6,7,8,9,...100
Если я хочу вырезать столбцы 5, я могу сделать
cut -d, -f-4,6-
что, если я хочу разрезать несколько не последовательных столбцов, таких как 5, 7 и т.д. есть ли один вкладыш?
с учетом ввода
echo 1,2,3,4,5,6,7,8,9,...100
Если я хочу вырезать столбцы 5, я могу сделать
cut -d, -f-4,6-
что, если я хочу разрезать несколько не последовательных столбцов, таких как 5, 7 и т.д. есть ли один вкладыш?
Вы должны быть в состоянии продолжить последовательности непосредственно в вашей существующей спецификации -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".
Иногда легче думать о том, какие поля исключать.
Если количество полей, которые не режутся (не сохраняются на выходе), невелико, может быть проще использовать флаг --complement
, например. включить все поля 1-20, кроме 3, 7 и 12 - сделать это:
cut -d, --complement -f3,7,12 <inputfile
Вместо
cut -d, -f-2,4-6,8-11,13-
Вы можете разрезать все столбцы нечетные/четные, используя 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 - вы можете просто изменить условия для создания более сложных условий для указания погоды, в которой должен быть напечатан столбец.
То же самое можно сделать с 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]"'