首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据特定位置字符对文件中的行进行排序

根据特定位置字符对文件中的行进行排序
EN

Stack Overflow用户
提问于 2012-07-20 04:09:22
回答 3查看 3.5K关注 0票数 1

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

这是给我的一个文件:

代码语言:javascript
复制
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对其进行排序,就会得到以下结果:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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。

有什么能帮到我吗?

提前感谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-20 04:42:22

您可以使用排序命令,指定多个键和键结束位置:

代码语言:javascript
复制
sort -n -k 3.8,3.12 -k 3.6,3.7 -k 3.4,3.5 < input_file

产出:

代码语言:javascript
复制
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[,F.C]表示开始和停止位置,其中F是字段号,C是字段中的字符位置;两者都是原点1.字段中的字符从前面的空格开始计算。

票数 3
EN

Stack Overflow用户

发布于 2015-04-25 17:33:05

接受的答案实际上没有回答在特定范围的绝对字符位置上进行排序的问题,从行的开头算起(这是sort计算的位置1)。

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

代码语言:javascript
复制
sort -k 1.STARTPOS,1.ENDPOS

如果希望排序键扩展到行尾,则可以关闭1.ENDPOS

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

票数 1
EN

Stack Overflow用户

发布于 2012-07-20 04:24:16

我知道有更好的方法来做这件事,但这是我过去做过的,很少需要对文件进行排序。

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11572770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档