join, sort kérdés

Fórumok

Tudtok ebben segíteni?
Van 2 adatbázis, txt kiterjesztésű file-om.

file1 tartalma soronként: hash:salt:ID
file2 tartalma soronként: username:hash:salt

Szeretném a file2-ből a file1-hez hozzáadni a username mezőt, ott ahol a hash:salt egyezik
file3 így kellene, hogy kinézzen: username:hash:salt:ID

Azaz, ahol mindkét file-ban egyezik a hash:salt, az kerüljön át a 3 file-ba, úgy hogy sor elejére a megfelelő username, végére pedig a megfelelő ID kerüljön.

Több ezer sorról van szó, file1 kevesebb sort tartalmaz.

Amit próbáltam,:
join <(sort -t":" -k 1 file1.txt) <(sort -t":" -k 2 file2.txt) > file3.txt

Köszönöm.

Hozzászólások

Ha esetleg jó Pythonban is (csak futólag teszteltem):


#!/usr/bin/env python3
#-*- coding:utf-8 -*-

# file1 tartalma soronként: hash:salt:ID
# file2 tartalma soronként: username:hash:salt
# output file3:  username:hash:salt:ID

f1,f2,f3 = open("file1.txt"),open("file2.txt"),open("file3.txt","w")
l1,l2,l3 = [],[],[]

for line in f1:
    line= line.strip()
    if line:
        hashi,salt,ID = line.split(':')
        l1.append( [ hashi.strip(), salt.strip(),ID.strip() ] )
f1.close()

for line in f2:
    line= line.strip()
    if line:
        user,hashi,salt = line.split(':')
        l2.append( [ user.strip(), hashi.strip(), salt.strip()] )
f2.close()

for hashi,salt,ID in l1:
    for user,h2,s2 in l2:
        if h2==hashi and s2==salt:
            f3.write(user+":"+h2+":"+s2+":"+ID+"\n")
f3.close()

--
eutlantis

Ok. Köszönöm.

Próbáltam ezt is, de valamiért üres file az eredmény:
join -1 1 -2 2 -t: -o2.1,2.2,2.3,1.3 <(sort -t":" -k 1,2 file1.txt) <(sort -t":" -k 2,3 file2.txt) > file3.txt

Több ezer soros mindkét file. Ha próbaképpen kivágok mindkét file-ból pár sort és azokat mentve összehasonlítom akkor működik a join command. A több ezres sort tartalmazó file-okkal viszont nem.

Ez bezavarhat esetleg?
file1.txt ASCII text
file2.txt data

Ha a file1 nem túl nagy ahhoz, hogy berántsuk a memóriába, akkor én awk-val támadnék:


awk -F":" 'NR==FNR{ID[$1":"$2]=":"$3} NR>FNR {print $0.ID[$2":"$3]}' file1 file2 > file3

Nekem a felpakolt példáddal szépen működik. A Mercenary14 és a rcmonster112 usereknél is oda kerül az ID.

Debian stretch alatt próbáltam.


$ awk --version
GNU Awk 4.1.4, API: 1.1 (GNU MPFR 3.1.5, GNU MP 6.1.2)

Esetleg nézd meg egy kicsit szebb szintaxissal:


awk -F":" 'NR==FNR{ID[$1,$2]=":" $3} NR>FNR {print $0 ID[$2,$3]}' file1 file2