
Ich versuche, das herauszufinden.
awk '{print $1","$10","$11","$12","$13,$14,$15,$16,$17,$18,$19}' <<< "$PASTE_1" > test.csv
Ich muss $1 $10 $11 $12 durch Komma getrennt drucken und dann mit $13 bis zum Ende der Zeile fortfahren, ohne Kommatrennung. Da es ab $13 viele Leerzeichen gibt.
Antwort1
Meinst du so etwas:
awk '{a = ""; for (i = 13 ; i <= NF ; i++) a = a $i;
print $1 "," $10 "," $11 "," $12 "," a}'
Die Eingabe
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
gibt:
a,j,k,l,mnopqrstuvwxyz
Das heißt, die Felder ab 13 werden aneinandergereiht und dann nach 1, 10, 11 und 12 ausgedruckt.
Antwort2
Eine Möglichkeit, dies zu tun:
awk -v OFS=, '{print $1, $10, $11, $12, ($13 $14 $15 $16 $17 $18 $19) }'
Antwort3
perl -lane 'print join(",", @F[0,9..11], q//), @F[12..$#F]'
Erläuterung
- Das Array
@F
enthält die Felder in einer Zeile.@F[...]
bezieht sich auf eineslice
der Elemente des Arrays @F.@F[0,9..11]
Der Slice besteht also aus dem 1., 10. bis 12. Element von @F, die dannjoin
von - verknüpft werdencomma
, und ein leeres Dummy-Elementq//
wird an das Slice angehängt, um das,
für das folgende erforderliche zu erzeugenslice
. Das andereslice
@F[12..$#F]
sammelt das 13. bis letzte Element des@F
Arrays über das$#F
, das die IDX des letzten Elements enthält. (Bitte beachten Sie, dass die Array-Indizierung in mit Null beginntPerl
.) - Die verschiedenen Argumente werden jetzt mit = (Standardwert: null)
print
miteinander verbunden .OFS
$,