首页 > 解决方案 > 仅基于第 2 列对 csv 文件进行排序。如果第 2 列的 2 行相同,则应仅输入文件顺序。不应基于任何其他列进行排序

问题描述

我看过很多关于基于列对文件进行排序的帖子,但对我没有帮助。

我只想根据第 2 列对 CSV 文件进行排序。

例如:我文件中的数据如下所示

H1,H2,H3,H4
C11,R_G,S_F_G,22-OCT-2019
C12,R_G,S_F_G,22-OCT-2019
C13,R_E,S_F_E,22-OCT-2019
C13,R_E,S_F_E_RA,22-OCT-2019
C13,R_E,S_F_E_RB,22-OCT-2019
C14,R_E,S_F_E,22-OCT-2019
C14,R_E,S_F_E_RA,22-OCT-2019
C14,R_E,S_F_E_RB,22-OCT-2019

第 2 列的预期排序顺序如下

H1,H2,H3,H4
C13,R_E,S_F_E,22-OCT-2019
C13,R_E,S_F_E_RA,22-OCT-2019
C13,R_E,S_F_E_RB,22-OCT-2019
C14,R_E,S_F_E,22-OCT-2019
C14,R_E,S_F_E_RA,22-OCT-2019
C14,R_E,S_F_E_RB,22-OCT-2019
C11,R_G,S_F_G,22-OCT-2019
C12,R_G,S_F_G,22-OCT-2019

我尝试使用以下命令进行排序

awk 'NR==1; NR > 1 {print $0 | "sort -t, -k2"}' inputfile >> outputfile

结果如下

H1,H2,H3,H4
C13,R_E,S_F_E,22-OCT-2019
C14,R_E,S_F_E,22-OCT-2019
C13,R_E,S_F_E_RA,22-OCT-2019
C14,R_E,S_F_E_RA,22-OCT-2019
C13,R_E,S_F_E_RB,22-OCT-2019
C14,R_E,S_F_E_RB,22-OCT-2019
C11,R_G,S_F_G,22-OCT-2019
C12,R_G,S_F_G,22-OCT-2019

如果您观察结果,第 2 列和第 3 列正在排序,但我只想对第 2 列进行排序,如果第 2 列与 2 行相同,则它应该按照输入文件中出现的顺序排列。

如果有人能帮助我理解我做错了什么,那就太好了

标签: shellcsvunixawk

解决方案


为什么不简单地使用head,tailsort, 例如

head -n1 file; tail -n+2 file | sort -t, -k2

在使用head -n1 file简单地输出标题的情况下,然后将获得的剩余行通过tail -n+2 file管道输送到sort -t, -k2进行排序,结果是带有标题的完整排序文件。

要创建包含排序结果的新文件,请在子 shell 中运行命令行并将输出重定向到新文件,例如

(head -n1 file; tail -n+2 file | sort -t, -k2) > sortedfile

(如果您愿意,您可以使用 2-steprm file; mv sortedfile file将原始文件替换为已排序的文件)

示例使用/输出

$ head -n1 file; tail -n+2 file | sort -t, -k2
H1,H2,H3,H4
C13,R_E,S_F_E,22-OCT-2019
C14,R_E,S_F_E,22-OCT-2019
C13,R_E,S_F_E_RA,22-OCT-2019
C14,R_E,S_F_E_RA,22-OCT-2019
C13,R_E,S_F_E_RB,22-OCT-2019
C14,R_E,S_F_E_RB,22-OCT-2019
C11,R_G,S_F_G,22-OCT-2019
C12,R_G,S_F_G,22-OCT-2019

推荐阅读