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

File 根据特定位置字符对文件中的行进行排序,file,shell,unix,sorting,solaris,File,Shell,Unix,Sorting,Solaris,我想根据.txt文件中的特定字符对文件进行排序 这是给我的文件: 12345678901234567890123456789012345 header 1stfoo DDMMYYYY 2ndfoo sltele Hoodie 24051988 d12Hdq sltele Hoodie 07051987 d30Hdq sltele Hoodie 07082011 d08Hdq sltele Hoodie 09081961 d04Hdq s

我想根据.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-k3,3thisfile.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

有人能帮我吗


提前感谢

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

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

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

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

可以使用“排序”命令,指定多个关键点和关键点的开始-结束位置:

sort -n -k 3.8,3.12 -k 3.6,3.7 -k 3.4,3.5 < input_file
从排序手册页:

对于启动和停止位置,KEYDEF是F[.C][OPTS][,F[.C][OPTS]],其中 F是字段编号,C是字段中的字符位置;两者都是 起源1。。。字段中的字符从字符开始计数 前面的空白


可以使用“排序”命令,指定多个关键点和关键点的开始-结束位置:

sort -n -k 3.8,3.12 -k 3.6,3.7 -k 3.4,3.5 < input_file
从排序手册页:

对于启动和停止位置,KEYDEF是F[.C][OPTS][,F[.C][OPTS]],其中 F是字段编号,C是字段中的字符位置;两者都是 起源1。。。字段中的字符从字符开始计数 前面的空白


接受的答案实际上并没有回答从行首开始计算的特定绝对字符位置范围的排序问题(即排序所计算的位置1)

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

sort -k 1.STARTPOS,1.ENDPOS
如果希望排序键扩展到 这条线的尽头


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

接受的答案实际上并没有回答从行首开始计算的特定绝对字符位置范围的排序问题(即排序所计算的位置1)

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

sort -k 1.STARTPOS,1.ENDPOS
如果希望排序键扩展到 这条线的尽头


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

是的。。。这就是我想要的解决方案。。。非常感谢你佩雷尔:)是的。。。这就是我想要的解决方案。。。非常感谢你,佩雷尔:)