Drucken Sie den Spaltenbereich durch Kommas getrennt und den Rest ohne Kommas getrennt.

Drucken Sie den Spaltenbereich durch Kommas getrennt und den Rest ohne Kommas getrennt.

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

  1. Das Array @Fenthält die Felder in einer Zeile. @F[...]bezieht sich auf eine sliceder Elemente des Arrays @F. @F[0,9..11]Der Slice besteht also aus dem 1., 10. bis 12. Element von @F, die dann joinvon - verknüpft werden comma, und ein leeres Dummy-Element q//wird an das Slice angehängt, um das ,für das folgende erforderliche zu erzeugen slice. Das andere slice @F[12..$#F]sammelt das 13. bis letzte Element des @FArrays über das $#F, das die IDX des letzten Elements enthält. (Bitte beachten Sie, dass die Array-Indizierung in mit Null beginnt Perl.)
  2. Die verschiedenen Argumente werden jetzt mit = (Standardwert: null) printmiteinander verbunden .OFS$,

verwandte Informationen