根据第一列/行中的字符长度对文件进行排序

时间:2013-01-31 12:38:55

标签: linux sorting sed awk grep

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

我不知道如何解决这个问题。我正在使用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 

这甚至可能吗?

3 个答案:

答案 0 :(得分:10)

按第一个单词的长度增加每一行,然后排序:

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

如有必要,请事后用cut -d ' ' -f 2-删除辅助字段。

答案 1 :(得分:2)

或者你也可以像之后那样使用sed

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

答案 2 :(得分:1)

您也可以使用coreutils,尽管效率很低:

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

如果可用,则使用GNU parallel:

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-