私は次のようにファイルの内容をごちゃ混ぜにしました:
13,13,GAME_FINISH,
1,1,GAME_START,
1,1,GROUP_FINISH,
17,17,WAGER,200.00
2,2,GAME_FINISH,
2,2,GAME_START,
22,22,GAME_WIN,290.00
2,2,GROUP_FINISH,
32,32,WAGER,200.00
3,3,GAME_FINISH,
3,3,GAME_START,
.... more lines
私はそれをソートし、現在次の形式でファイルの内容を保持しています。
1,1,GAME_FINISH,
1,1,GAME_START,
1,1,GROUP_FINISH,
1,1,WAGER,200.00
2,2,GAME_FINISH,
2,2,GAME_START,
2,2,GAME_WIN,290.00
2,2,GROUP_FINISH,
2,2,WAGER,200.00
3,3,GAME_FINISH,
3,3,GAME_START,
3,3,GROUP_FINISH,
3,3,WAGER,200.00
... more lines
しかし、どうすれば次の形式を取得するためにそれをより適切にソートできますか?3行目と4行目は常に存在するとは限りません。
1,1,WAGER,200.00
1,1,GAME_START,
1,1,GAME_WIN,500.00
1,1,BONUS_WIN_1,1100.00
1,1,GAME_FINISH,
1,1,GROUP_FINISH,
2,2, more lines...
最初の並べ替えには、
sort -t, -g -k2 nameofunsortedfile.csv >> sortedfile.csv
追加情報:
賭け、ゲーム開始、ゲーム勝利、ボーナス勝利、ゲーム終了、グループ終了の順に並べ替えたいと思います。私の現在のソートはこの順序ではありません。ゲームの勝利とボーナスの勝利が常に存在するとは限りません。
私が期待している順序は辞書ではなく、ランダムでもありません。すべての数字には常に賭け、開始、game_finishgroup_finishシーケンスがあります。game_win、game_bonusはオプションです。上記の予想される順序でターゲット1,1の並べ替えを例証する方法を探して、2,2に進み、同じようにします。
標準のUNIXユーティリティでこれを行う最も簡単な方法は、おそらく各行にフィールドを追加することです。これにより、レコードの種類が希望の順序で並べ替えられます。
declare -A mapping=( ["WAGER"]=1 ["GAME_START"]=2 ["GAME_WIN"]=3 ["BONUS_WIN"]=4 ["GAME_FINISH"]=5 ["GROUP_FINISH"]=6 )
cut -d, -f3 filename.txt | while read; do echo ${mapping["$REPLY"]}; done | paste -d, - filename.txt | sort | sort -s -t, -n -k 2,3 | cut -d, -f 2-
このdeclare
ステートメントは、各レコードタイプの順序を検索できるようにするマッピングを宣言します。特定の値(1
、2
など)は問わない限り、彼らは、ソート順序にしたいと。必要に応じて、文字や単語を使用できます。
次の行は、次のコマンドで構成されています。
cut -d, -f3 filename.txt
並べ替えたいもの(WAGER
または何でも)を抽出しますwhile read; do echo ${mapping["$REPLY"]}; done
各値(WAGER
など)を取得し、連想配列からの対応する並べ替え可能な値に置き換えますmapping
paste -d, - filename.txt
これらの値を各行の先頭に貼り付けます。 filename.txt
sort | sort -s -t, -n -k 2,3
フィールド2、フィールド3、フィールド1(追加したもの)で並べ替える効果があります。sort
3つのフィールドをキーとして使用できる場合は、1つのsort
コマンドでこれを実行できますが、並べ替えに使用できるフィールドは2つまでです。cut -d, -f 2-
追加されたフィールドを取り除き、元のレコードを残しますが、並べ替えられた順序でこの記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加