SED を使用して CSV 内の 2 つの列を交換する

SED を使用して CSV 内の 2 つの列を交換する

,10 個の異なるフィールド (は区切り文字)を含む CSV ファイルがあります。サンプル データ:

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

field2交換してfield3使用する必要がありますsedが、正規表現の書き方が理解できずに困っています。

私は他のバリエーションも試してみました:

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

私のテストファイルでは:

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

問題なく動作します…しばらくこれを見ていますが、理解できません。どなたか指示をいただける方はいらっしゃいますか?

答え1

試す:

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

内訳:

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

\([^,]*,\)3 回繰り返されます。行の残りの部分は変更されず、一致しません。

awk の場合:

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

答え2

sedソリューション使用q:

$ 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

関連情報