我想更改此 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 列的内容放入临时变量
tmp4
、tmp5
和中,然后根据上面的列表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
即只需设置输入和输出字段分隔符,然后按照您想要的顺序打印字段。