SQL benzeri gruplara göre ve komut satırındaki metin dosyaları için toplamı?


7

İki alanlı büyük metin dosyalarım var, birincisi bir dize, ikincisi bir tamsayı. Dosyalar ilk alana göre sıralanır. Çıktıya girmek istediğim, benzersiz bir dize başına bir satır ve aynı dizgelerin sayılarının toplamıdır. Bazı dizeler yalnızca bir kez görünürken, diğerleri birkaç kez görünür. Örneğin, aşağıdaki örnek verilere bakıldığında, sonuçta glehnia dizisi için 10 + 22 = 32 almak istiyorum.

Bunun nasıl gnuwin32 komut satırı araçlarıyla veya linux kabuğuyla yapılması öneriniz var mı?

Teşekkürler!

glehnia 10
glehnia 22
glehniae 343
glehnii 923
glei 1171
glei 2283
glei 3466
gleib 914
gleiber 652
gleiberg 495
gleiberg 709


Benzer cevapları olan stackoverflow.com/q/10286522/424651 adresindeki yinelenen soru , ancak en çok oy alan cevap , aşağıda kabul edilen yanıttan daha kısa ve özlü (her ikisi de awk programlarıdır).
chbrown

Yanıtlar:


5

AWK’da şöyle bir şey yapabilirsiniz:

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

Çok teşekkürler! TAB'ı sınırlayıcı olarak kullanmak için biraz ince ayar yapmak zorunda kaldım, ancak beni başlattı!
dnkb

1
@dnkb: Yazdırma ifadelerinizde virgül kullanılması, çıktı alanı ayırıcısını ayarlamanıza olanak sağlar ve ardından yazdırma işlemi otomatik olarak kullanır. Yaptığınız şey bu olabilir:awk 'BEGIN {OFS="\t"} ($1 == last || last == "") {sum += $2} ($1 != last && last != "") {print last, sum; sum = $2} {last = $1} END {print last, sum}' huge_text_file.txt
Dennis Williamson

2

Bu tür sorgular en kolay ve esnek biçimde SQL'de yapılır. SQLet ve SQLite'ı bu amaç için kullanabilirsiniz :

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

1

Bunu başarmak için birkaç Lua hattı kullanabilirsiniz . Lua, Windows ve Linux dahil olmak üzere çok çeşitli platformlarda kullanılabilir.

- Hızlı ve kirli - hata kontrolü yok, sıralanmamış çıktı yok

io.input ( 'huge_text_file.txt')

sonuçlar = {}

io.lines () 'daki satır için
    metin için string.gmatch içindeki sayı (satır, '(% w +)% s + (% d +)')
        sonuç [metin] = (sonuç [metin] veya 0) + sayı
    son
son

Metin için, çiftler halinde sayı (sonuç) yapın
    Yazdır (metin, sayı)
son

Çıktıyı herhangi bir sıralama yardımcı programını veya birkaç Lua satırını kullanarak sıralayabilirsiniz.


1

Örneğin, uniq komutunu kullanabilirsiniz.

cat file | uniq -u -c

nerede: -c - oluşum sayısı -u - yalnızca benzersiz satırları yazdır


1
soruyu okudun mu
Tomas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.