Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 仅根据第2列对csv文件进行排序。如果第2列的两行相同,则应仅输入文件顺序。不应基于任何其他列进行排序_Shell_Csv_Unix_Awk - Fatal编程技术网

Shell 仅根据第2列对csv文件进行排序。如果第2列的两行相同,则应仅输入文件顺序。不应基于任何其他列进行排序

Shell 仅根据第2列对csv文件进行排序。如果第2列的两行相同,则应仅输入文件顺序。不应基于任何其他列进行排序,shell,csv,unix,awk,Shell,Csv,Unix,Awk,我看过很多关于根据列对文件进行排序的帖子,但都没有帮到我 我只想根据第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_

我看过很多关于根据列对文件进行排序的帖子,但都没有帮到我

我只想根据第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
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
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列的预期排序顺序如下

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
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
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
我试着用下面的命令排序

awk 'NR==1; NR > 1 {print $0 | "sort -t, -k2"}' inputfile >> outputfile
结果如下所示

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
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
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行相同,则应按照输入文件中的显示顺序进行排序

如果有人能帮助我理解我在使用Miller()和跑步时做错了什么,那就太好了

mlr --csv sort -f H2 input.csv
你会有

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

为什么不简单地使用
排序
,例如

head -n1 file; tail -n+2 file | sort -t, -k2
如果使用
head-n1文件
只输出标题,那么使用
tail-n+2文件
获得的剩余行通过管道传输到
sort-t,-k2
进行排序,结果是带有标题的完整排序文件

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

(head -n1 file; tail -n+2 file | sort -t, -k2) > sortedfile
(然后,如果愿意,您可以使用
rm文件;mv sortedfile文件
的两个步骤将原始文件替换为已排序的文件)

示例使用/输出

$ 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
试试这个:-

sort --field-separator=',' --key=2 filename
--字段分隔符=','=>字段分隔符为“


--key=2或-k2:根据第二列编号对数据进行排序

格伦·杰克曼的答案可能重复,但不重复@RaviSaroch,我希望仅根据第2列进行排序。如果第2列中的两行相同,则应按输入文件中的显示顺序排列。我已经试过你提到的解决办法了。谢谢你的时间。@Raj你看到这个答案了吗?不好吗?为什么?感谢you@aborruso由于管理员限制,我将无法安装。即使我在获得批准后安装到我的开发机器上,在我的生产服务器上安装它也是一项艰巨的工作,因为它涉及到很多批准过程。谢谢您的时间@David Rankin。我希望只根据第2列进行排序。如果第2列中的两行相同,则应按输入文件中的显示顺序排列。如果观察发布的结果,当第2列相同时,将根据第1/3列对其进行排序。但我希望它和输入文件的顺序相同。请注意我在问题中提到的预期结果。我明白你的意思。这可能需要手动排序,因为即使使用
awk
sort
或使用shell的
sort
,对使用的算法也几乎没有控制。您几乎需要一个冒泡排序或插入排序。再过一两个小时我就有时间进一步看了。谢谢你的时间@RaviSaroch。我希望只根据第2列进行排序。如果第2列中的两行相同,则应按输入文件中的显示顺序排列。我已经试过你提到的解决办法了。如果观察发布的结果,当第2列相同时,将根据第1/3列对其进行排序。但我希望它和输入文件的顺序相同。请注意我在问题“mlr”中提到的预期结果不被认可。看起来我必须安装/配置Miller项目。如果是,我需要在aboruso完成很多审批流程。你能让我知道同样可以通过awk/其他常规命令实现。谢谢您的时间。@Raj Miller是awk、sed、cut、join和sort,用于名称索引数据,如CSV、TSV和tabular JSON。安装起来很容易