2017-06-06 4 views
1

この出力をソートするにはどうすればよいですか?予想unix - 特定のキーを並べ替える方法

10.1.3.39:{ "range_start" : 96, "range_end" : 96 } 
10.1.3.27:{ "range_start" : 33, "range_end" : 33 } 
10.1.3.100:{ range_start" : 30, "range_end" : 30 } 
10.1.2.233:{ "range_start" : 78, "range_end" : 78 } 
10.1.4.239:{ "range_start" : 53, "range_end" : 53 } 
10.1.2.161:{ "range_start" : 44, "range_end" : 44 } 

私はそうrange_startキー

ことで、この出力をソートしたいが、次のようになります。

ここ
10.1.3.100:{ "range_start" : 30, "range_end" : 30 } 
10.1.3.27:{ "range_start" : 33, "range_end" : 33 } 
10.1.2.161:{ "range_start" : 44, "range_end" : 44 } 
10.1.4.239:{ "range_start" : 53, "range_end" : 53 } 
10.1.2.233:{ "range_start" : 78, "range_end" : 78 } 
10.1.3.39:{ "range_start" : 96, "range_end" : 96 } 
+1

第3の入力行に 'range_start'の前に引用符がありません。 –

+0

ええ、私は質問でそれを修正しました。ありがとう。 – noober

答えて

2

あなたがそうのようなdecorate, sort, undecorateパイプを行うことができます。

$ awk -F",|:" '{printf "%s\t%s\n", $3,$0}' file | sort -n | awk -F"\t" '{print $2}' 

あるいは、\tまたは他のユニークな区切り文字を使用している場合、あなたはcut使用することができます。

$ awk -F",|:" '{printf "%s\t%s\n", $3,$0}' file | sort -n | cut -f 2 

いずれの場合:

10.1.3.100:{ range_start" : 30, "range_end" : 30 } 
10.1.3.27:{ "range_start" : 33, "range_end" : 33 } 
10.1.2.161:{ "range_start" : 44, "range_end" : 44 } 
10.1.4.239:{ "range_start" : 53, "range_end" : 53 } 
10.1.2.233:{ "range_start" : 78, "range_end" : 78 } 
10.1.3.39:{ "range_start" : 96, "range_end" : 96 } 

テキストデータにタブがある場合は、\tを別の区切り文字に変更します。

1

我々は、JSONのような形式ではなく、コラム形式のテキストを持っています空白で区切られたフィールド値だけで並べ替えることができます:

sort -n -k 4,4 

e希望する出力。

ただし、形式を認識しているパーサーを使用すると、多くの場合に役立ちます。 たとえば、キーと値がスペースで一貫して区切られていないと、sortの解決策は失敗します。

0.1.3.100:{ range_start":30, "range_end" : 30 } 

、またはエントリの順序が一貫していない場合。

0.1.2.233:{ "range_end" : 108, "range_start" : 78 } 
10.1.3.39:{ "range_start" : 96, "range_end" : 96 } 
関連する問題