我想根据.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。
可以帮助我吗?提前致谢
答案 0 :(得分:2)
您可以使用sort命令,指定多个键和键开始结束位置:
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
来自sort man-page:
KEYDEF是F [.C] [OPTS] [,F [.C] [OPTS]]的开始和停止位置,其中 F是字段编号,C是字段中的字符位置;两者都是 origin 1 ...字段中的字符从头开始计算 前面的空白。
答案 1 :(得分:1)
接受的答案实际上没有回答对特定范围的绝对字符位置进行排序的问题,从行的开头开始计算(由sort
计算的位置1)。
重要的是要记住,对于sort
,字段编号是指由字段分隔符分隔的文本部分,除非使用{更改,否则这是非空白到空白的转换{1}} / -t
选项。
对从行首开始计算的绝对字符位置范围进行排序的正确方法是从字段编号1开始计算字符,如下所示:
--field-separator=SEP
如果您希望排序键扩展到,则可以不使用sort -k 1.STARTPOS,1.ENDPOS
结束了。
使用绝对字符位置混淆字段编号会导致令人惊讶(通常非常令人沮丧)的结果。
答案 2 :(得分:0)
使用强类型通用列表。
对于自定义排序,Sort方法的重载需要比较器。通过反转常规比较,您可以按降序排序:
list.Sort(delegate(DateTime x, DateTime y){ return y.CompareTo(x); });
使用C#3中的lambda表达式,委托更容易创建:
list.Sort((x, y) => y.CompareTo(x));
这可以提供帮助;
List<DateTime> dates = ... // init and fill
dates.Sort();
dates.Reverse();
答案 3 :(得分:0)
我知道有更好的方法可以做到这一点,但这是我过去所做的,很少需要对文件进行排序。
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