web-dev-qa-db-ja.com

コマンドラインのテキストファイルのgroupbyとsumのようなSQL?

2つのフィールドを持つ巨大なテキストファイルがあります。1つ目は文字列、2つ目は整数です。ファイルは最初のフィールドでソートされます。出力に取得したいのは、一意の文字列ごとに1行と、同じ文字列の数値の合計です。一部の文字列は1回だけ表示され、他の文字列は複数回表示されます。例えば。以下のサンプルデータを前提として、文字列glehniaの場合、結果に10 + 22 = 32を取得したいと思います。

Gnuwin32コマンドラインツールまたはLinuxシェルでこれを行う方法の提案はありますか?

ありがとう!

グレニア10
グレニア22
glehniae 343
glehnii 923
glei 1171
glei 2283
glei 3466
グレイブ914
gleiber 652
gleiberg 495
gleiberg 709

7
dnkb

AWKでは、次のようなことができます。

awk '($1 == last) || (last == "") {sum += $2}
     ($1 != last) && (last != "") {print last " " sum; sum = $2}
                                  {last = $1}
     END                          {print last " " sum}' huge_text_file.txt
5

このタイプのクエリは、SQLで最も簡単かつ柔軟に実行されます。その目的のために SQLet とSQLiteを使用できます:

sqlet.py -d' ' -A file1.txt 'select a1, sum(a2) from A group by a1' | sqlite3
2
Tomas

Lua の数行を使用して、これを実現できます。 Luaは、WindowsやLinuxを含む幅広いプラットフォームで利用できます。

-迅速で汚い-エラーチェックなし、ソートされていない出力
 
 io.input( 'huge_text_file.txt')
 
 results = { } 
 
 io.lines()の行の場合do 
テキストの場合、string.gmatch(line、 '(%w +)%s +(%d +)')の数値
 results [text] =(results [text] or 0)+ number 
 end 
 end 
 
テキストの場合、ペアの数値(results )do 
 print(text、number)
 end 

任意の並べ替えユーティリティまたはLuaの数行を使用して、出力を並べ替えることができます。

1

たとえば、niqコマンドを使用できます

cat file | uniq -u -c

ここで、-c-出現回数-u-一意の行のみを出力します

1
Tom