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

(私のボックスでは、これはソリューションの約4倍の速度で実行されawk | sort | cutます。)

これはひどいperlイディオムを使用し、のセマンティクスを悪用し-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

sort.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 に答える