【问题标题】:sort lines in file based on specific location character根据特定位置字符对文件中的行进行排序
【发布时间】:2012-07-20 04:09:22
【问题描述】:

我想根据 .txt 文件中的特定字符对文件进行排序。

这是给我的文件:

12345678901234567890123456789012345
header     1stfoo   DDMMYYYY 2ndfoo
sltele     Hoodie   24051988 d12Hdq
sltele     Hoodie   07051987 d30Hdq
sltele     Hoodie   07082011 d08Hdq
sltele     Hoodie   09081961 d04Hdq
sltele     Hoodie   20041962 d14Hdq
sltele     Hoodie   20032000 d01Hdq
sltele     Hoodie   13062002 d05Hdq

如您所见,有一列包含 DDMMYYY 格式的日期。如果我使用sort -n -k 3,3 thisfile.txt > sortedfile.txt 对其进行排序,我会得到以下结果:

sltele     Hoodie   07051987 d30Hdq
sltele     Hoodie   07082011 d08Hdq
sltele     Hoodie   09081961 d04Hdq
sltele     Hoodie   13062002 d05Hdq
sltele     Hoodie   20032000 d01Hdq
sltele     Hoodie   20041962 d14Hdq
sltele     Hoodie   24051988 d12Hdq

但是,我想要这样的结果:

sltele     Hoodie   09081961 d04Hdq
sltele     Hoodie   20041962 d14Hdq
sltele     Hoodie   07051987 d30Hdq
sltele     Hoodie   24051988 d12Hdq
sltele     Hoodie   20032000 d01Hdq
sltele     Hoodie   13062002 d05Hdq
sltele     Hoodie   07082011 d08Hdq

作为基于 DDMMYYYY 日期格式的有效 sortedfile.txt。

有人可以帮我吗?

提前致谢

【问题讨论】:

    标签: file shell unix sorting solaris


    【解决方案1】:

    可以使用sort命令,指定多个key,key起始结束位置:

    sort -n -k 3.8,3.12 -k 3.6,3.7 -k 3.4,3.5 < input_file
    

    输出:

    sltele     Hoodie   09081961 d04Hdq
    sltele     Hoodie   07051987 d30Hdq
    sltele     Hoodie   24051988 d12Hdq
    sltele     Hoodie   20032000 d01Hdq
    sltele     Hoodie   20042000 d14Hdq
    sltele     Hoodie   13062002 d05Hdq
    sltele     Hoodie   07082011 d08Hdq
    

    来自排序手册页:

    KEYDEF 是 F[.C][OPTS][,F[.C][OPTS]] 的开始和停止位置,其中 F是字段编号,C是字段中的字符位置;两者都是 origin 1 ...字段中的字符从开头开始计数 前面的空格。

    【讨论】:

    • 是的...这就是我想要的解决方案...非常感谢 perreal :)
    【解决方案2】:

    接受的答案实际上并没有回答对特定范围的绝对字符位置进行排序的问题,从行首开始计数(由sort 计数的位置 1)。

    请务必记住,对于 sort,字段编号是指由 字段分隔符 分隔的文本部分,除非使用 -t 进行更改,否则这是一个非空白到空白的过渡/--field-separator=SEP 选项。 对从行首开始计数的绝对字符位置范围进行排序的正确方法是从字段号 1 开始计数字符,如下所示:

    sort -k 1.STARTPOS,1.ENDPOS
    

    如果您希望排序键扩展到 行尾。

    将字段编号与绝对字符位置混淆可能会导致令人惊讶(而且通常非常令人沮丧)的结果。

    【讨论】:

      【解决方案3】:

      我知道有更好的方法可以做到这一点,但这是我过去所做的,很少需要对文件进行排序。

      sed -e 's/\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{4\}\)/\3\2\1/g' thisfile.txt | \
         sort -n -k 3,3 | \
         sed -e 's/\([0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)/\3\2\1/g' > sortedfile.txt
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-18
        • 2019-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-21
        • 2021-09-12
        • 1970-01-01
        相关资源
        最近更新 更多