番号

2016-09-12 29 views
1

のブロックのための数値的にAWKソート列/行は、私は、テキストファイルがあります。番号

aa 
80,143 
60,312 
50,123 
20,14 
bb 
cc 
80,163 
60,132 
50,23 
20,48 

を、私は数字のブロックが発見された最大のたびに小さい番号から行をソートしたい...

期待される結果は次のようになります。どのようにソート機能は、これを達成するために呼び出すことができます

aa 
20,14 
50,123 
60,312 
80,143 
bb 
cc 
20,48 
50,23 
60,132 
80,163 

+0

が私のためにテーブルを編集するためにどうもありがとうございます!それはテキストボックスでそれを行う方法を非常に明白ではなかった... –

+0

問題はありません。最初の数字が同じ2行の場合はどうなりますか? –

+0

あなたが投稿した入力について考えてみてください。アルファベット順と数値ソートがあることはご存知でしょうか?そして、それらのうちの1つでは、「11」は「2」の前にあり、「11」は「2」の後に来ます。だから、すべての先頭の数字が同じ桁数になるように入力データを作成するのはなぜでしょうか?間違ったソート方法を使用した場合、2行にカンマ相対的な順序を解決するためにカンマの後の桁に移動するには? [編集]あなたの質問は、少なくとも1つのブロックに '5,21'と' 5,22'と '5,110'のようなものを含めるようにしてください。 –

答えて

1

おそらく最も簡単にはawkや友人

$ awk '{if(!/[0-9,]/) {c++;d=0} else {d=1} print c "." d "," $0}' file | 
    sort -nt, | 
    cut -d, -f2- 

aa 
20,14 
50,123 
60,312 
80,143 
bb 
cc 
20,48 
50,23 
60,132 
80,163 
+1

常に同じ数の先頭桁がない場合、/が失敗すると失敗します。最初の '60'を' 6'に変更してみてください。また、このイディオムでは、awkのOFSとしてコンマの代わりにタブを使うべきです。これは、ソートとカットのデフォルトの区切り文字であるため、それぞれ '-t'と' -d'を使う必要はありません(ただし、 '-t、'は何もしていないので、ソートに別のフィールドを実際には使用しないでください。 –

+0

私は絶対に初心者であることについて謝罪する必要があります。私はWindowsのcmdコマンドウィンドウにコードを入力し、 '-nt、システムが指定されたファイルを見つけることができません'というエラーメッセージが表示されます。 'Cutは内部または外部のコマンド、実行可能なプログラムまたはバッチファイルとして認識できません。'これは正しい形式で 'ソート'と 'カット'というメソッドを呼び出すのではないためですか? –

+0

これらはUNIXのコマンドですが、私はあなたがcygwinやそれに類するものを使うべきだと思います。私は/ awkのWindows版がうまくいくかどうかわからない。 'awk'スクリプト内で完全なコマンドを実装することもできます。 – karakfa

0

これは、指定されたサンプル入力のために働くだろうとあなたが提供していませんでしたもっと面白いの入力のために働くだろうと/ソート/ undecorateアプローチを飾るある(私のコメントを参照してくださいあなたの質問の下で):

$ cat tst.awk 
function prtArr(  a,b) { 
    PROCINFO["sorted_in"] = "@ind_num_asc" 
    for (a in arr) { 
     for (b in arr[a]) { 
      print a, b 
     } 
    } 
    delete arr 
} 
BEGIN { FS=OFS="," } 
/^[0-9,]+$/ { arr[$1][$2]; next } 
{ prtArr(); print } 
END { prtArr() } 

$ awk -f tst.awk file 
aa 
20,14 
50,123 
60,312 
80,143 
bb 
cc 
20,48 
50,23 
60,132 
80,163 

上記では、真の多次元配列とsorted_inにGNU awk 4. *を使用しています。

+0

ありがとうございます。私はPCにGNU awk 4を持っていません。したがって、関数prtArrのソース行に違法な文があります...私が使用している基本的なawkです...もし5行ごとに4行をソートする方法について提案があれば助言してください対処するのが簡単ですか? –

+0

対処するのが簡単ではありません。ちょうどGNU awk 4を入手してください。0またはそれ以降、あなたはそれなしで非常に便利な機能のトーンを欠いている。あなたがWindows上にいるなら、cygwinをインストール/使用して、あなたの人生をもっと簡単にすることができ、GNU awk 4にはそれがあります。 –

1

TXR言語の最新バージョンは、awk macroを持っています。これは、TXR Lispの構文とセマンティクスでAwkパラダイムを実装しています。

可能な解決策は、次のようになります。

;; sort list of (integer string) by the integer, ascending, 
;; then extract the list of strings from the sorted result, 
;; and dump it as a list of lines with tprint. 

(defun sort-dump (num-rec-pairs) 
    (tprint [mapcar second [sort num-rec-pairs < first]])) 

;; Awk job 

(awk (:begin (set fs "," ofs ","))   ;; set up I/O field separators 
    (:let list)        ;; bind local variable "list" 

    ;; if we have two fields ... 
    ((= nf 2) (mf int-str)     ;; map string fields to integers 
       (push (list [f 0] rec) list)) ;; push (field rec) pair to list 

    ;; if we have one field ... 
    ((= nf 1) (sort-dump list)    ;; dump the list 
       (set list nil)    ;; clear the list 
       (prn))      ;; print current record 

    (:end (sort-dump list)))    ;; dump list at end of awk job 

ファイル名を指定して実行:

 
$ txr sort.tl data 
aa 
20,14 
50,123 
60,312 
80,143 
bb 
cc 
20,48 
50,23 
60,132 
80,163 
+0

興味深いです... – karakfa

+0

@karakfa新しく開発された〜210 LOC:http://www.kylheku.com/cgit/txr/tree/share/txr/stdlib/awk.tl – Kaz