Bashソートの別の問題

Bashソートの別の問題

このリストを並べ替えるときに「クアラルンプール」のスペースをどのように無視できますか?列を選択してタブでソートして正しい結果を得ましたが、列の空白を処理する方法を知りたいです。特に、リスト形式を再指定するのは良い習慣のようには見えないからです。リストがより大きい時間であるとき。

事前にありがとう

  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つのスペースごとにタブがあると思います)。

TAB2) 次のように区切り合わせを使用します。

TAB=`echo -e "\t"`
sort -t"$TAB" YOUR_FILE

答え2

注: - あなたの質問は2回変わりましたが、答えを変更することはできませんが、答えは変わりません。-k22が列である場所を使用して列番号をソートすると、次のようになります。正解です。

私は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. フィールド区切り文字がすべてのフィールドで有効な文字ではないことを確認してください。スペースは都市名に有効な文字なので、他の文字をフィールド区切り文字として使用する必要があります。

オプション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が機能します。

関連情報