【问题标题】:Trying to sort a text file with dates in brackets with "sort"尝试使用“排序”对括号中日期的文本文件进行排序
【发布时间】:2021-02-17 17:36:22
【问题描述】:

我正在尝试按日期对文本进行排序。 我的文件格式是:

...
[15/08/2019 - 01:58:49] some text here
[15/08/2019 - 02:21:23] more text here
[15/08/2019 - 02:56:11] blah blah blah
...

我用 sort 命令尝试了多种不同的方法。

一次尝试:“sort -b --key=1n --debug Final_out.txt

sort: using ‘en_US.UTF-8’ sorting rules
sort: key 1 is numeric and spans multiple fields
sort: option '-b' is ignored

^ no match for key
^ no match for key
...
__
.?
^ no match for key
__
.?
^ no match for key
__
sort: write failed: 'standard output': Input/output error
sort: write error

第二次尝试:“sort -n -b --key=10,11 --debug Final_out.txt” 在上面产生相同的输出

快把我的头发扯掉了。这必须是可能的,它是Linux!有没有好心人指点一下?

【问题讨论】:

  • 您将不得不使用 awk 或其他东西来提取时间戳,将它们转换为可以按字典顺序排序的东西,然后将其传递给排序。

标签: bash sorting awk sh


【解决方案1】:

正如 Shawnn 所建议的,如何使用 bash 解决方案:

#!/bin/bash

pat='^\[([0-9]{2})/([0-9]{2})/([0-9]{4})[[:blank:]]+-[[:blank:]]+([0-9]{2}:[0-9]{2}:[0-9]{2})\]'
while IFS= read -r line; do
    if [[ $line =~ $pat ]]; then
        m=( "${BASH_REMATCH[@]}" )      # make a copy just to shorten the variable name
        echo -e "${m[3]}${m[2]}${m[1]}_${m[4]}\t$line"
    fi
done < file.txt | sort -t $'\t' -k1,1 | cut -f2-
  • 变量pat是匹配日期时间字段的正则表达式 并将 bash 变量 BASH_REMATCH[@] 分配给日、月、年和时间 按顺序排列。
  • 提取日期和时间字段后,它会生成一个新字符串 由按可排序顺序的年、月、日和时间组成,并在前面添加 以制表符分隔的当前行的字符串
  • 然后整行通过管道传输到sort,键入第一个字段。
  • 最后第一个字段是cut off。

输入文件file.txt:

[10/01/2020 - 01:23:45] lorem ipsum
[15/08/2019 - 02:21:23] more text here
[15/08/2019 - 02:56:11] blah blah blah
[15/08/2019 - 01:58:49] some text here
[14/08/2019 - 12:34:56] dolor sit amet

输出:

[14/08/2019 - 12:34:56] dolor sit amet
[15/08/2019 - 01:58:49] some text here
[15/08/2019 - 02:21:23] more text here
[15/08/2019 - 02:56:11] blah blah blah
[10/01/2020 - 01:23:45] lorem ipsum

【讨论】:

  • 也许还链接到Schwartzian transform
  • @tripleee 是的。 Perl 可以通过公式化的方式做到这一点。
  • 语言并不重要;总体思路是为您的数据添加规范化版本的前缀,对其进行排序,然后丢弃规范化版本。
【解决方案2】:

这是使用gnu awk 的另一种较短的排序方式:

cat file
[10/01/2020 - 01:23:45] lorem ipsum
[15/08/2019 - 02:21:23] more text here
[15/08/2019 - 02:56:11] blah blah blah
[15/08/2019 - 01:58:49] some text here
[14/08/2019 - 12:34:56] dolor sit amet

使用这个 awk:

awk -v FPAT='[0-9:]+' '{ map[$3,$2,$1,$4] = $0 } 
END { PROCINFO["sorted_in"]="@ind_str_asc"; for (k in map) print map[k] }' file
[14/08/2019 - 12:34:56] dolor sit amet
[15/08/2019 - 01:58:49] some text here
[15/08/2019 - 02:21:23] more text here
[15/08/2019 - 02:56:11] blah blah blah
[10/01/2020 - 01:23:45] lorem ipsum

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    • 2018-09-02
    相关资源
    最近更新 更多