【问题标题】:linux bash to sort text file by 'yymmdd' instead of 'ddmmyy' column format, then sort by time, then remove duplicateslinux bash按'yymmdd'而不是'ddmmyy'列格式对文本文件进行排序,然后按时间排序,然后删除重复项
【发布时间】:2021-09-19 08:20:19
【问题描述】:

问候。 我请需要在一个文本文件中对行进行排序,该文本文件有 11 个以逗号分隔的字段。

  • 第 10 列包含格式为 'ddmmyy' 的日期
  • 第 1 列包含格式为 'hhmmss.sss' 的时间戳

- 排序标准 1,按第 10 列排序,但首先按年,然后按月,然后按天, 就像日期格式是 'yymmdd' 而不是 'ddmmyy'

-排序标准2,按第2列排序,包含时间戳。

这是一个示例文件

$GPSACP: 100054.764,1056.0063N,00002.9733E,1.75,91.0,3,236.46,0.40,0.22,280521,05
$GPSACP: 140054.764,1056.0063N,00002.9733E,1.75,91.0,3,236.46,0.40,0.22,160621,05
$GPSACP: 210038.264,1026.4147N,00129.9725E,3.75,87.0,3,43.87,2.58,1.39,160621,03
$GPSACP: 210038.265,1026.4147N,00129.9725E,3.75,87.0,3,43.87,2.58,1.39,160615,03
$GPSACP: 100038.265,1026.4147N,00129.9725E,3.75,87.0,3,43.87,2.58,1.39,280717,03
$GPSACP: 100038.265,1026.4147N,00129.9725E,3.75,87.0,3,43.87,2.58,1.39,280518,03
$GPSACP: 210039.264,1026.4147N,00129.9725E,3.75,87.0,3,43.87,2.58,1.39,280521,03
$GPSACP: 211054.764,1057.0063N,00002.9733E,1.75,91.0,3,236.46,0.40,0.22,280521,05
$GPSACP: 211054.764,1056.0063N,00002.9733E,1.75,91.0,3,236.46,0.40,0.22,160621,05
$GPSACP: 210538.264,1026.4148N,00129.9725E,3.75,87.0,3,43.87,2.58,1.39,160614,03
$GPSACP: 210538.265,1026.4147N,00129.9725E,3.75,87.0,3,43.87,2.58,1.39,160621,03
$GPSACP: 211638.265,1026.5147N,00129.9725E,3.75,87.0,3,43.87,2.58,1.39,280521,03
$GPSACP: 211539.264,1026.4147N,00129.9725E,3.75,87.0,3,43.87,2.58,1.39,280521,03

这就是我希望得到的结果:

$GPSACP: 210538.264,1026.4148N,00129.9725E,3.75,87.0,3,43.87,2.58,1.39,160614,03

$GPSACP: 210038.265,1026.4147N,00129.9725E,3.75,87.0,3,43.87,2.58,1.39,160615,03

$GPSACP: 100038.265,1026.4147N,00129.9725E,3.75,87.0,3,43.87,2.58,1.39,280717,03

$GPSACP: 100038.265,1026.4147N,00129.9725E,3.75,87.0,3,43.87,2.58,1.39,280518,03

$GPSACP: 100054.764,1056.0063N,00002.9733E,1.75,91.0,3,236.46,0.40,0.22,280521,05
$GPSACP: 211638.265,1026.5147N,00129.9725E,3.75,87.0,3,43.87,2.58,1.39,280521,03
$GPSACP: 211539.264,1026.4147N,00129.9725E,3.75,87.0,3,43.87,2.58,1.39,280521,03
$GPSACP: 210039.264,1026.4147N,00129.9725E,3.75,87.0,3,43.87,2.58,1.39,280521,03
$GPSACP: 211054.764,1057.0063N,00002.9733E,1.75,91.0,3,236.46,0.40,0.22,280521,05
$GPSACP: 140054.764,1056.0063N,00002.9733E,1.75,91.0,3,236.46,0.40,0.22,160621,05
$GPSACP: 210038.264,1026.4147N,00129.9725E,3.75,87.0,3,43.87,2.58,1.39,160621,03
$GPSACP: 210538.265,1026.4147N,00129.9725E,3.75,87.0,3,43.87,2.58,1.39,160621,03
$GPSACP: 211054.764,1056.0063N,00002.9733E,1.75,91.0,3,236.46,0.40,0.22,160621,05

我想使用 bash 排序,但我不知道如何以不同的顺序处理日期。

任何帮助表示赞赏。

谢谢。马里奥。

【问题讨论】:

  • 文件的每一行是否以文字字符串 $GPSACP: 开头?如果不是,请更新问题以显示文件的内容;你提到想使用sort ...请用你迄今为止尝试过的内容更新问题
  • 您的示例输出似乎将第 6 行和第 7 行放在错误的位置。 (大概不应该出现空行?)
  • $GPSACP: 前缀是常量。不应出现空行。
  • 如果不应该出现空行,那么edit你的问题是删除它们。

标签: bash sorting awk


【解决方案1】:

假设每一行都以$GPSACP: 开头,或者它们都不以sort 开头,您可以使用sort

sort -t, -k10.5,10.6 -k10.3,10.4 -k10.1,10.2 -k1,1 input.txt

这有效地将第 10 列拆分为三个 2 位数字块,然后可以独立排序。然后按第 1 列进行子排序。(因为第 1 列前缀是常量,所以不会影响排序。)-t 选项将列分隔符更改为逗号。


如果$GPSACP: 前缀是 常量,如果您有支持“稳定排序”选项的sort 版本(-s),那么您可以按(空格-delimited) 第 2 列,然后按第 10 列的部分排序:

sort -k2 input.txt | sort -t, -k10.5,10.6 -k10.3,10.4 -k10.1,10.2 -s

【讨论】:

  • 亲爱的 jhnc,$GPSACP:前缀是不变的。你的第一个答案就是我想要的。谢谢。感谢您的解释,让我理解代码。非常感谢。
猜你喜欢
  • 2021-09-01
  • 1970-01-01
  • 2012-08-22
  • 2013-06-03
  • 1970-01-01
  • 2016-01-15
  • 2018-05-30
  • 2016-11-07
  • 1970-01-01
相关资源
最近更新 更多