类似于从最长到最短排序行,如何将文件中的所有行从最短到最长排序?例如”
这是一个很长的句子。 这不是那么长。 这不长。
那变成:
这不长。 这不是那么长。 这是一个很长的句子。
它与您提供的链接几乎完全相同
awk '{ print length($0) " " $0; }' $file | sort -n | cut -d ' ' -f 2-
该-r
选项用于反转排序。
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
请注意,此解决方案在大输入时效果不佳。
您还可以在以下范围内进行排序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.
另一个 perl 实现:
perl -ne 'print length($_)." $_"' file | sort -n | cut -d ' ' -f 2-
$_
是当前行,类似于awk的$0