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'列格式对文本文件进行排序,然后按时间排序,然后删除重复项的主要内容,如果未能解决你的问题,请参考以下文章