【问题标题】:sort a file based on length of chars in the first column/row根据第一列/行中字符的长度对文件进行排序
【发布时间】:2013-01-31 12:38:55
【问题描述】:

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

我不知道该怎么做。我使用的是 Linux,所以 sed/awk/sort 都可用。

.abs 是 bla bla 12 .abc 是 bla se 23 bla .fe 是 bla bla bla .jpg 是图片扩展名 .se 用于瑞典域名

我想要的是根据每行第一列的长度对这些行进行排序。 有些行以 4 个字符开头,有些以 3 或 2 开头。我希望结果类似于:

.fe 是 bla bla bla .se 用于瑞典域名 .abs 是 bla bla 12 .abc 是 bla se 23 bla .jpg 是图片扩展名

这甚至可能吗?

【问题讨论】:

  • 对于相同长度的行(column1),你会如何排序?

标签: linux sorting sed awk grep


【解决方案1】:

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

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

如有必要,之后用cut -d ' ' -f 2- 删掉辅助字段。

【讨论】:

  • @Instronics:不客气,欢迎您。接受一个有效的答案是说谢谢的常用方式。 :-)
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    你也可以用 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-
    

    【讨论】:

      猜你喜欢
      • 2018-02-23
      • 2011-02-04
      • 2014-12-02
      • 1970-01-01
      • 2020-01-23
      • 2013-11-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多