2013-01-31 66 views
3

我需要根据第一列中的字符数对文件进行排序。根据第一列/行中字符的长度对文件进行排序

我不知道如何去做这件事。我正在使用Linux,所以sed/awk/sort都可用。

 
.abs is bla bla 12 
.abc is bla se 23 bla 
.fe is bla bla bla 
.jpg is pic extension 
.se is for swedish domains 

我想要的是根据每行中第一列的长度对这些行进行排序。 一些线路开始4个字符,有的开始用3或2。我要的结果是这样的:

 
.fe is bla bla bla 
.se is for swedish domains 
.abs is bla bla 12 
.abc is bla se 23 bla 
.jpg is pic extension 

这甚至可能吗?

+0

对于相同长度的行(列1),您将如何对它们进行排序? – Kent

回答

9

增加每一行由第一字的长度,然后进行排序:

awk '{ print length($1) " " $0; }' $FILE | sort -n 

如有必要,切出的辅助字段cut -d ' ' -f 2-之后。

+0

这就像一个魅力,非常感谢你的帮助 – Instronics

+0

@Instronics:不客气,欢迎您。接受工作答案是说谢谢的常用方式。 :-) – thiton

1

您还可以使用的coreutils做到这一点,虽然比较低效:

paste -d' ' <(cut -d' ' -f1 infile | xargs -l sh -c 'echo "$1" | wc -c' '{}') infile | 
    sort -n | cut -d' ' -f2- 

或者用GNU平行(如果可用):

paste -d' ' <(cut -d' ' -f1 infile | parallel wc -c '<<< {}') infile | 
    sort -n | cut -d' ' -f2- 

或者使用bash:

<infile while read c1 rest; do echo ${#c1} "$c1" "$rest"; done | 
    sort -n | cut -d' ' -f2- 
1

或者你也可以像这样使用sed

awk '{print length($1)" "$0}' temp.txt | sort -k 1,2| sed -re 's/^[0-9]+ //'

相关问题