1. ホーム
  2. bash

[解決済み] テキストファイルをスペースを含む行の長さでソートする

2022-04-22 09:43:38

質問

次のようなCSVファイルがあります。

AS2345,ASDF1232,平凡な例さん,110 Binary ave.,Atlantis,RI,12345,(999)123-5555,1.56
AS2345,ASDF1232,平野さんの例,1121110 Ternary st. 110 Binary ave...,Atlantis,RI,12345,(999)123-5555,1.56です。
AS2345,ASDF1232、ミスター・プレイン例、110 Binary ave.,Liberty City,RI,12345,(999)123-5555,1.56。
AS2345,ASDF1232、平野さんの例、110 Ternary ave.,Some City,RI,12345,(999)123-5555,1.56。

スペースを含む行の長さでソートしたいのですが。以下のコマンドでは スペースが含まれていますが、これを修正する方法はありますか?

cat $@ | awk '{ print length, $0 }' | sort -n | awk '{$1=""; print $0}'

解決方法は?

回答

cat testfile | awk '{ print length, $0 }' | sort -n -s | cut -d" " -f2-

あるいは、同じ長さの行をすべてサブソートするという、独自の(おそらく意図的でない)方法をとることもできます。

cat testfile | awk '{ print length, $0 }' | sort -n | cut -d" " -f2-

どちらの場合も、最終的なカットには awk を使わないようにすることで、あなたが述べた問題を解決しました。

長さが一致する行 - 同数の場合はどうするか。

質問では、長さが一致する行についてさらなるソートが必要かどうかが指定されていません。 私は、これは不要であると仮定し、以下の使用方法を提案しました。 -s ( --stable ) を使って、そのような行が互いにソートされるのを防ぎ、入力に現れる相対的な順序を維持するようにします。

(これらのタイのソートをもっと制御したい人は、sort の --key オプションがあります)。

問題の解答が失敗する理由 (awk による行の再構築)。

という違いがあるのが面白い。

echo "hello   awk   world" | awk '{print}'
echo "hello   awk   world" | awk '{$1="hello"; print}'

これらはそれぞれ

hello   awk   world
hello awk world

(gawkの)マニュアルの該当部分 は、1 つのフィールドを変更すると、awk は $0 の全体を (セパレータなどに基づいて) 再構築するということを余談として述べているだけです。 おかしな挙動ではないのでしょう。 こんなのがあるんですね。

"最後に、フィールドと OFS の現在の値を使って、awk にレコード全体を再構築させるのが便利な場合があります。これを行うには、一見無害に見える代入:".を使用します。

 $1 = $1   # force record to be reconstituted
 print $0  # or whatever else with $0

"This forces awk to rebuild record."

同じ長さの行をいくつか含むテスト入力。

aa A line   with     MORE    spaces
bb The very longest line in the file
ccb
9   dd equal len.  Orig pos = 1
500 dd equal len.  Orig pos = 2
ccz
cca
ee A line with  some       spaces
1   dd equal len.  Orig pos = 3
ff
5   dd equal len.  Orig pos = 4
g