最初の列で等しくない空白を使用して並べ替え

最初の列で等しくない空白を使用して並べ替え

このリストを名前、高温、低温でソートする必要があります。

Kuala Lumpur 78 56
Seoul 85 66
Karachi 95 75
Tokyo 85 60
Lahore 85 75
Manila 90 85

空白は列の区切り記号なので、 sort -k 1 次のように与えることができると思いました。

Karachi         95 75
Kuala Lumpur    78 56
Lahore          85 75
Manila          90 85
Seoul           85 66
Tokyo           85 60

しかし、「クアラルンプール」は空間問題で問題を起こした。

それで、「Lumpur」を列として扱い、最初の数値セットをソートしてみました。

sort -k 3n

しかし、私はそれを理解します:

Tokyo           85 60
Seoul           85 66
Karachi         95 75
Lahore          85 75
Kuala Lumpur    78 56 <---Why is this out of order?
Manila          90 85

この空間で何をしますか?

答え1

他の人の意見のように、カンマ区切り値(CSV)であれば、データ操作が簡単になります。

データをCSVに変換するソリューションは次のとおりです。

$ cat file | sed 's/ \([0-9]\)/,\1/g' 
Kuala Lumpur,78,56
Seoul,85,66
Karachi,95,75
Tokyo,85,60
Lahore,85,75
Manila,90,85

数字の前のスペースはカンマで置き換えられます。\1参照グループ([0-9])、つまりスペースの後の数字。ここでは、sortパラメーターを使用してフィールド区切り-t文字を指定できます。

$ cat file | sed 's/ \([0-9]\)/,\1/g' | sort -t, -k2  
Kuala Lumpur,78,56
Tokyo,85,60
Seoul,85,66
Lahore,85,75
Manila,90,85
Karachi,95,75

空白に変換したりテーブルを作成したりするには、次の2つの例を参照してください。

$ cat test | sed 's/ \([0-9]\)/,\1/g' | sort -t, -k2 | tr , ' '
Kuala Lumpur 78 56
Tokyo 85 60
Seoul 85 66
Lahore 85 75
Manila 90 85
Karachi 95 75

$ cat test | sed 's/ \([0-9]\)/,\1/g' | sort -t, -k2 | column -s, -t 
Kuala Lumpur  78  56
Tokyo         85  60
Seoul         85  66
Lahore        85  75
Manila        90  85
Karachi       95  75

答え2

awk '{print $NF,$0}' file.txt | sort -nr -k1 | cut -d' ' -f2-
  • $NF:フィールド数、$0:全行
  • sort -nr:数字逆順(降順)
  • sort -k1:最初の列に基づいて並べ替え(スペースとタブの順序で区切られます)
  • cut -d:区切り記号(デフォルトはタブ)
  • cut -f2-:フィールド2から最後まで(区切り文字を折りたたんだり削除したりしない)
ruby -e 'puts readlines.sort_by{|l|l.split[-1].to_i}.reverse' file.txt
  • readlines=ARGF.readlines
  • splitデフォルトではスペースに分割

答え3

ファイルをタブ区切りの列に変更できる場合は、生活が簡単になります。ファイルを変更できない場合は、次のPerlステートメントが代わりに実行します。

perl -ne 's/\s+/\t/g; s/([a-z])\s([a-z])/$1 $2/ig; s/\t$/\n/; print;' file |
  sort -t$'\t' -nk3
Kuala Lumpur    78  56  
Tokyo   85  60  
Seoul   85  66  
Karachi 95  75  
Lahore  85  75  
Manila  90  85  

説明する:

  • s/\s+/\t/g:スペースをすべてTABに変更します。
  • s/([a-z])\s([a-z])/$1 $2/ig:2文字(数字なし)の間のタブ文字を1つのスペースに変更します。
  • s/\t$/\n/:最初の置換では、各行の末尾にタブ文字を追加して改行文字(\n)に変更します。

  • sort -t$'\t' -nk3:TABを区切り文字として使用します(ソートには奇妙な構文があります。わかります。ここ詳しくは、3番目の列の数字で並べ替えてください。

関連情報