3

类似于从最长到最短排序行,如何将文件中的所有行从最短到最长排序?例如”

这是一个很长的句子。
这不是那么长。
这不长。

那变成:

这不长。
这不是那么长。
这是一个很长的句子。
4

5 回答 5

7

它与您提供的链接几乎完全相同

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

-r选项用于反转排序。

于 2012-09-14T02:40:36.847 回答
6
perl -ne 'push @a, $_ } { print sort { length $a <=> length $b } @a' input

(在我的盒子上,它的运行速度比awk | sort | cut解决方案快 4 倍。)

请注意,这使用了一个可怕的惯用语并滥用语义-n来节省一些击键。最好把它写成:

perl -ne '{ push @a, $_ } END { print sort { length $a <=> length $b } @a }' input
于 2012-09-14T15:17:36.510 回答
1

请注意,此解决方案在大输入时效果不佳。

您还可以在以下范围内进行排序awk

cat << EOF > file
This is a long sentence.
This is not so long.
This is not long.
EOF

排序.awk

# Only find length once
{ len = length($0) }     

# If we haven't seen this line before add it to the lines array 
# and move on to next record
lines[len] == "" { lines[len] = $0; next }

# A duplicate, append to the previous record
{ lines[len] = lines[len] RS $0 }

END {
  # lines array is sorted according to the indices, the sorted
  # indices are stored in the indices array
  asorti(lines, indices)
  for(key in indices)
    print lines[indices[key]]
}

像这样运行:

awk -f sort.awk file

或作为单行:

< file awk '{ len = length($0) } lines[len] == "" { lines[len] = $0; next } { lines[len] = lines[len] RS $0 } END { asorti(lines, indices); for(key in indices) print lines[indices[key]] }'

输出:

This is not long.
This is not so long.
This is a long sentence.
于 2012-09-14T09:59:53.947 回答
1

使用 POSIX awk:

{
  c = length
  m[c] = m[c] ? m[c] RS $0 : $0
} END {
  for (c in m) print m[c]
}

例子

于 2014-11-05T02:23:35.267 回答
1

另一个 perl 实现:

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

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

于 2015-11-04T00:25:52.777 回答