使用 SED 交换 CSV 中的两列

DJJ*_*113 3 sed text-processing csv

我有一个包含 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
Run Code Online (Sandbox Code Playgroud)

我需要交换field2field3使用,sed但很难理解如何编写正则表达式。

我尝试过其他变体:

sed 's/\(.*[,]\)\(.*[,]\)\(.*[,]\)/\1\3\2/g' test
Run Code Online (Sandbox Code Playgroud)

在我的测试文件中:

abc,def,ghi,jkl
1234,5678,abcd,efgh
Run Code Online (Sandbox Code Playgroud)

它工作正常......我已经研究了一段时间,但无法弄清楚。任何人都能够提供一些方向?

Arc*_*ege 5

尝试:

sed 's/^\([^,]*,\)\([^,]*,\)\([^,]*\)/\1\3\2/'
Run Code Online (Sandbox Code Playgroud)

分解:

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

\([^,]*,\)重复三次。该行的其余部分未更改且不匹配。

使用 awk:

awk 'BEGIN {FS=OFS=","}{t=$2;$2=$3;$3=t;print}'
Run Code Online (Sandbox Code Playgroud)

  • 请记住,如果 CSV 文件包含带逗号的字段,这些将不起作用。解决这个问题的最简单方法是使用完全了解 CSV 的解析器。 (3认同)