Tauschen Sie zwei Spalten in einer CSV mit SED aus

Tauschen Sie zwei Spalten in einer CSV mit SED aus

Ich habe eine CSV-Datei, die 10 verschiedene Felder enthält ( ,ist das Trennzeichen). Beispieldaten:

student-id,last,first,hwk1,hwk2,hwk3,exam1,hwk4,hwk5,exam2
pts-avail,,,100,150,100,200,150,100,300
991-78-7872,Thompson,Ken,95,143,79,185,135,95,259

Ich muss austauschen field2und field3verwenden sed, habe aber Schwierigkeiten zu verstehen, wie man den regulären Ausdruck schreibt.

Ich habe es zusammen mit anderen Variationen versucht:

sed 's/\(.*[,]\)\(.*[,]\)\(.*[,]\)/\1\3\2/g' test

In meiner Testdatei:

abc,def,ghi,jkl
1234,5678,abcd,efgh

Es funktioniert einwandfrei. Ich habe mir das eine Weile angesehen und komme nicht dahinter. Kann mir jemand eine Anleitung geben?

Antwort1

Versuchen:

sed 's/^\([^,]*,\)\([^,]*,\)\([^,]*\)/\1\3\2/'

Heruntergebrochen:

'^'     start at the beginning of the line
\(  \)  a grouping
[^,]    any character except ','
*       zero or more times
,       the character ','

Dies \([^,]*,\)wird dreimal wiederholt. Der Rest der Zeile bleibt unverändert und nicht zugeordnet.

Mit awk:

awk 'BEGIN {FS=OFS=","}{t=$2;$2=$3;$3=t;print}'

Antwort2

Nicht- sedLösung mitQ:

$ q -d, -H -O  'select [student-id],first,last,hwk1,hwk2,hwk3,exam1,hwk4,hwk5,exam2 from sample.csv' 
student-id,first,last,hwk1,hwk2,hwk3,exam1,hwk4,hwk5,exam2
pts-avail,,,100,150,100,200,150,100,300
991-78-7872,Ken,Thompson,95,143,79,185,135,95,259

verwandte Informationen