按照长度从长到短排序行

29

我如何将文件中所有行按照长度从长到短重新排列?例如:

elephant
zoo
penguin

将会被更改为

elephant
penguin
zoo

这个例子有点误导人,如果你不回去读问题的话。要将单词列表按照从长到短的顺序排序,请改编可接受的答案,例如 pip search json |awk '{print length($1)"\t"$1}' |sort -rn |cut -d' ' -f2-。显然,“pip search json”只是为了产生输出而不是文件名。 - ILMostro_7
4个回答

57

将行长度作为第一个字段添加到每一行,排序后移除行长度:

awk '{ print length($0) " " $0; }' $file | sort -r -n | cut -d ' ' -f 2-

2
为什么是猫?UUoCA - Fredrik Pihl
1
@Fredrik:我喜欢在管道前面加上文件名。不过你的奖励更好看,所以我已经修复了它。 - thiton
1
可以缩短为 $ awk '{print length"\t"$0}' File | sort -rn | cut -f2-,基本上是相同的东西,只是默认情况下 cut 操作选项卡,所以忽略它 :-) - Fredrik Pihl
@Fredrik,您使用制表符作为分隔符的较短版本有一个负面影响,即制表符会首先被打印出来。命令$ awk '{print length"\t"$0}' tlds-alpha-by-domain.txt输出"$0}' tlds-alpha-by-domain.txt2 AC等等...不使用制表符的较长版本可以生成更安全的终端/命令输出。至少在运行于Mac OS X 10.7.5上的bash版本3.2时是这样的。 - Pro Backup
2
@thiton:你可以在不使用cat的情况下将文件名放在前面,像这样:< input_file command1 | command2 | commmand3 > output_file - Keith Thompson
我正在使用类似的方法来查找第一个 build.gradle 文件,方法如下:find $PWD -name "build.gradle" | awk '{print length($0), $0 | "sort -n"}' | head -1 | cut -d ' ' -f 2- - Marslo

4
TIM(我对TIMTOWTDI的简称...嗯,但现在它已经很长了 :()
perl -ne '@a = <>; print sort { length $b <=> length $a } @a' file

需要时使用reversepush

我想知道在那个550MB的文件上需要多长时间


550MB的文件在perl 5.24上花费了14.2秒。 - Chris Koknat

2

Perl版本,向@thiton致敬:

perl -ne 'print length($_)." $_"' 文件 | sort -r -n | cut -d ' ' -f 2-

$_ 是当前行,类似于awk的$0

在一个有600万行的550MB .txt文件上执行perl-5.24,即英国国家语料库,仅花费了24秒


@thiton的awk(3.1.7)执行时间为26秒


向相关帖子的@William Pursell致敬:

perl -ne 'push @a, $_; END{ print reverse sort { length $a <=> length $b } @a }' 文件

perl-5.24执行时间为12.0秒


1
使用POSIX Awk:
{
  c = length
  m[c] = m[c] ? m[c] RS $0 : $0
} END {
  for (c in m) q[++x] = m[c]
  while (x) print q[x--]
}

示例


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接