linux bash按'yymmdd'而不是'ddmmyy'列格式对文本文件进行排序,然后按时间排序,然后删除重复项

Posted

技术标签:

【中文标题】linux bash按\'yymmdd\'而不是\'ddmmyy\'列格式对文本文件进行排序,然后按时间排序,然后删除重复项【英文标题】: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你的问题是删除它们。 【参考方案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:前缀是不变的。你的第一个答案就是我想要的。谢谢。感谢您的解释,让我理解代码。非常感谢。

以上是关于linux bash按'yymmdd'而不是'ddmmyy'列格式对文本文件进行排序,然后按时间排序,然后删除重复项的主要内容,如果未能解决你的问题,请参考以下文章

如何在 freemarker 语言中将当前日期格式(YYYY-MM-DD HH:MM:SS)转换为(YYMMDD)格式

Linux Shell 按Tab键不能补全

Oracle 按分钟而不是每天分组

Linux中dd命令的用法

删除Linux Terminal中的历史记录

删除Linux Terminal中的历史记录