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
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
このタイプのクエリは、SQLで最も簡単かつ柔軟に実行されます。その目的のために SQLet とSQLiteを使用できます:
sqlet.py -d' ' -A file1.txt 'select a1, sum(a2) from A group by a1' | sqlite3
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の数行を使用して、出力を並べ替えることができます。
たとえば、niqコマンドを使用できます
cat file | uniq -u -c
ここで、-c-出現回数-u-一意の行のみを出力します