我想更改此 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,
Run Code Online (Sandbox Code Playgroud)
像这样;
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
Run Code Online (Sandbox Code Playgroud)
我尝试了很多awk
命令但无法成功。有人可以告诉我该怎么做吗?
如果字段的原始顺序为 1, 2, 3, 4, 5, 6,则新顺序应为 1, 2, 3, 5, 6, 4(注意最后的 5, 6, 4)。
由于您使用csv对其进行了标记,因此我将使用支持 CSV 的工具,例如Miller ( 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
Run Code Online (Sandbox Code Playgroud)
另一个可以轻松执行此任务的 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
Run Code Online (Sandbox Code Playgroud)
如果我理解正确的话,您想通过以下方式交换列:
这应该相当容易 awk
:
awk 'BEGIN{FS=OFS=","} {tmp4=$4;tmp5=$5;tmp6=$6;$4=tmp5;$5=tmp6;$6=tmp4}1' input.csv
Run Code Online (Sandbox Code Playgroud)
,
。tmp4
内容分别存储在临时变量、tmp5
和中,然后根据上面的列表tmp6
重新分配列$4
、$5
和。$6
1
规则块之外看似“杂散”的内容指示awk
打印当前行,包括迄今为止所做的所有修改。请注意,默认情况下,awk
不会对文件执行就地修改,而只会打印到控制台,因此您必须重定向到输出文件并可能重命名。如果您有足够新的 GNU 版本awk
并且可以理解该-i inplace
扩展名,您还可以指示awk
直接修改该文件:
awk -i inplace ' .... ' input.csv
Run Code Online (Sandbox Code Playgroud)