このリストを並べ替えるときに「クアラルンプール」のスペースをどのように無視できますか?列を選択してタブでソートして正しい結果を得ましたが、列の空白を処理する方法を知りたいです。特に、リスト形式を再指定するのは良い習慣のようには見えないからです。リストがより大きい時間であるとき。
事前にありがとう
Kuala Lumpur 78 56
Seoul 86 66
Karachi 95 75
Tokyo 85 60
Lahore 85 75
Manila 90 85
都市別:
Karachi 95 75
Kuala Lumpur 78 56
Lahore 85 75
Manila 90 85
Seoul 86 66
Tokyo 85 60
また、高温(高低、2番目の列)と低温(低高、3番目の列)に合わせました。
高温を押して下さい:
Karachi 95 75
Manila 90 85
Seoul 86 66
Lahore 85 75
Tokyo 85 60
Kuala Lumpur 78 56
低温を押して下さい:
Kuala Lumpur 78 56
Tokyo 85 60
Seoul 86 66
Karachi 95 75
Lahore 85 75
Manila 90 85
答え1
1)コマンドでスペースをタブに変換しますunexpand
(8つのスペースごとにタブがあると思います)。
TAB
2) 次のように区切り合わせを使用します。
TAB=`echo -e "\t"`
sort -t"$TAB" YOUR_FILE
答え2
注: - あなたの質問は2回変わりましたが、答えを変更することはできませんが、答えは変わりません。-k2
2が列である場所を使用して列番号をソートすると、次のようになります。正解です。
私はsort + sedを使用しました。
都市別
sort -k1 input_data | sed '/^$/d; s/$/\n/'
高温を押して下さい:
sort -k2 -nr data | sed '/^$/d; s/$/\n/'
低温を押して下さい:
sort -k4 -nr data | sed '/^$/d; s/$/\n/'
説明する:
ソートされたデータはsedに送信されます。
次に sed を使用して最初の空行を削除し、各行の後/^$/d
に新しい行を追加します。
答え3
2つのオプションがあります。
空白が削除されたソート可能な新しい名前列を作成し、この一時/新しい列に基づいてソートし、最終的にこの「一時」列の出力を抑制します。または
フィールド区切り文字がすべてのフィールドで有効な文字ではないことを確認してください。スペースは都市名に有効な文字なので、他の文字をフィールド区切り文字として使用する必要があります。
オプション1を使用すると、名前をすべて小文字、数字の削除、文字を別の文字に変換するなどの別の名前に変更できるため、より多くの制御が可能ですが、実装がより複雑になります。
オプション2は次のように実行できます。
#!/bin/bash
awk '{TLOW=$(NF-1);
THIGH=$NF;
$NF="";
$(NF-1)="";
gsub(" +$","");
CITYNM=$0;
printf ("%s:%s:%s\n", CITYNM, TLOW, THIGH)}' | sort -t:
これで問題は、「Cape Town」や「Capelle」などの名前をソートする方法です。 UnixソートコマンドはCapeleをCape Townの前に配置しますが、時々あなたが望むものではありません。この時点でオプション1が機能します。