Распечатать диапазон столбцов, разделенных запятыми, а остальные — без запятых

Распечатать диапазон столбцов, разделенных запятыми, а остальные — без запятых

Я пытаюсь это понять.

awk '{print $1","$10","$11","$12","$13,$14,$15,$16,$17,$18,$19}' <<< "$PASTE_1" > test.csv

Мне нужно напечатать $1 $10 $11 $12, разделенные запятой, а затем продолжить с $13 до конца строки, без разделения запятой. Так как после $13 много пробелов.

решение1

Вы имеете в виду что-то вроде этого:

awk '{a = ""; for (i = 13 ; i <= NF ; i++) a = a $i; 
       print $1 "," $10 "," $11 "," $12 "," a}'

Вход

a b c d e f g h i j k l m n o p q r s t u v w x y z

дает:

a,j,k,l,mnopqrstuvwxyz

То есть поля, начинающиеся с 13, объединяются вместе, а затем печатаются после 1, 10, 11 и 12.

решение2

Один из способов сделать это:

awk -v OFS=, '{print $1, $10, $11, $12, ($13 $14 $15 $16 $17 $18 $19) }'

решение3

perl -lane 'print join(",", @F[0,9..11], q//), @F[12..$#F]'

Объяснение

  1. Массив @Fсодержит поля в строке. @F[...]относится к sliceэлементам массива @F. Таким образом, @F[0,9..11]это срез, состоящий из 1-го, 10-го и 12-го элементов @F, которые затем joinобъединяются с помощью , а к срезу добавляется commaфиктивный пустой элемент для генерации требуемого для следующего . Другой собирает с 13-го по последний элемент массива с помощью , который содержит idx последнего элемента. (Обратите внимание, что индексация массива начинается с нуля в ).q//,sliceslice @F[12..$#F]@F$#FPerl
  2. Различные аргументы printтеперь объединены с помощью OFS= $,(по умолчанию null).

Связанный контент