shell - 仅基于第 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 行相同,则它应该按照输入文件中出现的顺序排列。
如果有人能帮助我理解我做错了什么,那就太好了
解决方案
为什么不简单地使用head
,tail
和sort
, 例如
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
推荐阅读
- javascript - Dojo 2 dojo2 中是否有渲染后的生命周期挂钩?
- c# - 签署一个xml元素c#
- bash - CLI - 如何选择具有特殊编码的文件或目录?
- javascript - 从父母的 onClick 在 reactjs 上更新状态子项
- malbolge - 如何在malbolge中打印用户输入?
- swift - 为什么数组(collCells)在快速传递来自不同 ViewController 的数组元素时显示为空?
- dialogflow-es - 如何在 DialogFlow java 客户端 v2 中设置上下文
- php - 如何通过知道该图像的 URL 来防止攻击者运行嵌入在 jpg 图像中的 PHP 代码?
- jsp - Jsp 没有在 Spring Boot 应用程序中由 Jersey 编译
- angular - Angular2:主机侦听器是否应该取消订阅?主机监听器如何工作?如果我不必退订,什么时候退订?