如何使用 awk 交换 csv 文件中的列顺序?

如何使用 awk 交换 csv 文件中的列顺序?

我想更改此 CSV 的顺序

92000,X,19.30,2022-03-01 05:31:58.990562+00,19.29,
00293,X,40.64,2021-09-30 13:10:32.084467+00,40.49,
00293,X,80.95,2021-09-30 13:10:32.084467+00,80.49,
00293,X,41.60,2021-09-30 13:10:32.739939+00,41.49,

像这样;

92000,X,19.30,19.29,,2022-03-01 05:31:58.990562+00
00293,X,40.64,40.49,,2021-09-30 13:10:32.084467+00
00293,X,80.95,80.49,,2021-09-30 13:10:32.084467+00
00293,X,41.60,41.49,,2021-09-30 13:10:32.739939+00

我尝试了很多awk命令但无法成功。有人可以告诉我该怎么做吗?

如果字段的原始顺序是 1, 2, 3, 4, 5, 6,那么新的顺序应该是 1, 2, 3, 5, 6, 4(注意最后的 5, 6, 4)。

答案1

既然你用这个标记了,我会使用支持 CSV 的工具,例如磨坊主mlr), 而不是awk

要更改无标头 CSV 文件中最后三个字段的顺序,以便将第四个字段移至末尾:

$ mlr --csv -N reorder -e -f 4 file
92000,X,19.30,19.29,,2022-03-01 05:31:58.990562+00
00293,X,40.64,40.49,,2021-09-30 13:10:32.084467+00
00293,X,80.95,80.49,,2021-09-30 13:10:32.084467+00
00293,X,41.60,41.49,,2021-09-30 13:10:32.739939+00

另一个可以轻松执行此任务的 CSV 感知工具csvcut来自csvkit

$ csvcut -c 1,2,3,5,6,4 file
92000,X,19.30,19.29,,2022-03-01 05:31:58.990562+00
00293,X,40.64,40.49,,2021-09-30 13:10:32.084467+00
00293,X,80.95,80.49,,2021-09-30 13:10:32.084467+00
00293,X,41.60,41.49,,2021-09-30 13:10:32.739939+00

答案2

如果我理解正确的话,您想按以下方式交换列:

  • 第 4 栏将成为第 6 栏
  • 第 5 栏将成为第 4 栏
  • 第 6 列(空)将成为第 5 列

这应该相当容易 awk

awk 'BEGIN{FS=OFS=","} {tmp4=$4;tmp5=$5;tmp6=$6;$4=tmp5;$5=tmp6;$6=tmp4}1' input.csv 
  • 这会将输入和输出字段分隔符设置为,
  • 然后它将存储当前的分别将第 4、5 和 6 列的内容放入临时变量tmp4tmp5和中,然后根据上面的列表tmp6重新分配列$4$5和。$6
  • 1规则块之外看似“杂散”的内容指示awk打印当前行,包括迄今为止所做的所有修改。

请注意,默认情况下,awk不会对文件执行就地修改,而只会打印到控制台,因此您必须重定向到输出文件并可能重命名。如果您有足够新的 GNU 版本awk并且可以理解该-i inplace扩展名,您还可以指示awk直接修改该文件:

awk -i inplace ' .... ' input.csv

答案3

使用xsv

$ xsv select 1-3,5,6,4 file
92000,X,19.30,19.29,,2022-03-01 05:31:58.990562+00
00293,X,40.64,40.49,,2021-09-30 13:10:32.084467+00
00293,X,80.95,80.49,,2021-09-30 13:10:32.084467+00
00293,X,41.60,41.49,,2021-09-30 13:10:32.739939+00

xsv这将使用的命令根据需要对列进行重新排序select

答案4

$ awk -F, -v OFS=, '{print $1,$2,$3,$5,$6,$4}' file.csv 
92000,X,19.30,19.29,,2022-03-01 05:31:58.990562+00
00293,X,40.64,40.49,,2021-09-30 13:10:32.084467+00
00293,X,80.95,80.49,,2021-09-30 13:10:32.084467+00
00293,X,41.60,41.49,,2021-09-30 13:10:32.739939+00

即只需设置输入和输出字段分隔符,然后按照您想要的顺序打印字段。

相关内容