【问题标题】:Sort command in not working properly in unix for sorting a csv file排序命令在 unix 中无法正常工作以对 csv 文件进行排序
【发布时间】:2014-11-12 21:57:52
【问题描述】:

我有一个 csv 文件,我需要根据时间戳对其进行排序。它是 csv 中的第三列,我使用以下命令进行排序:

awk 'NR<2{print $_;next}{ print $_ | "sort -t, -k3.8,3.11nr -k3.1,3.3rM -k3.4rd" }' 

当年份为单一年份时,此命令可以正确排序,但对于存在多个年份的大数据,它会将较旧的数据放在首位或放在 csv 的某个位置之间。示例如下:

data2,Send for Translation To CTM,Dec 30 2013 02:22
data1,Send for Translation To CTM,Dec 30 2013 02:20
data1,Send for Translation To CTM,Sep 30 2014 03:22
data2,Send for Translation To CTM,Oct 30 2014 03:21

我需要把时间戳最晚的数据排列起来,年份应该按照这个顺序排列:2014、2013、2012等等……

我怎样才能做到这一点?

【问题讨论】:

  • 请在实际问题中添加一些示例输入和示例输出,而不是提供链接。
  • 第一个命令有效,但您没有告诉它反转排序顺序。第二个失败,因为您没有将 , 括在引号中

标签: linux


【解决方案1】:

以下应该可以工作

 awk 'NR<2{print $_;next}{ print $_ | "sort -t, -k3.8,3.11rn -k3.1,3.3rM -k3.5,3.6rn -k3.12rd" }'

'awk' sn-p 将除标题之外的所有行传递给排序命令。 键的顺序在这里很重要:

k3.8,3.11rn提取列的年份部分并反向排序

k3.1,3.3rM 提取第三列中的前 3 个字符进行反向每月排序,其余的我们进行反向字典排序

k3.5,3.6rn 提取日期并反向排序,最后我们对时间做同样的事情

【讨论】:

  • 能否请您进一步帮助我:stackoverflow.com/questions/26798317/…
  • 存在多个年份时不排序。我现在正在使用它: sort -t, -k3.8,3.11nr -k3.1,3.3rM -k3.4rd 但它没有按预期工作。你能告诉我吗?
  • 认为应该是 sort -t, -k3.1,3.3rM -k3.4,3.7rd -k3.8,3.11nr -k3.12rd
  • 对不起,我第二次没有正确理解我已经编辑了上面的答案,你在问题中的命令应该也可以工作,记住上面的解决方案忽略了第一行,所以你需要使用标题作为第一行,如果仍有问题,您能否像以前一样发布更大的文件摘录
【解决方案2】:

试试这个:

sort -rft',' -k3 merged.csv

【讨论】:

  • 这又是没有正确排序。文件按以下顺序排序:10 月 31 日、10 月 30 日和 11 月 3 日的数据正在整理。我需要像 11 月 3 日、10 月 31 日和 10 月 30 日这样的降序排列。加上标题也已经到了底部!
【解决方案3】:

我将尝试按日期排序,然后按时间排序

awk -F"," '{print $3,$1,$2}' file.csv | sort -d' ' -k 1d -k 2d

顺便说一句,如果您只分享文件的一小部分,那就太好了。 :)

【讨论】:

  • 谢谢,下次我会记住这一点的 :) 不过,这个命令说的是无效选项 -- ' '
猜你喜欢
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-14
  • 1970-01-01
  • 2023-03-24
  • 2021-03-21
相关资源
最近更新 更多