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.
- 1326 megtekintés
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
- A hozzászóláshoz be kell jelentkezni
Köszönöm. Ez az üzenet mit jelent? Ezt kaptam futattáskor.
Traceback (most recent call last):
File "python.sh", line 21, in
user,hashi,salt = line.split(':')
ValueError: too many values to unpack
- A hozzászóláshoz be kell jelentkezni
Valoszinű van a fájlodban üres sor vagy olyan ami nem tartalmaz kettő ":" karaktert.
Ha azokat kitörlöd akkor jó lesz.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
Próbáltam. Hiányzik az output-ból az id mező valamiért.
A kérédsem itt is fent van, mintákkal. Ide nem engedte a hash:salt:id részeket betenni.
http://www.unix.com/unix-for-beginners-questions-and-answers/273676-add…
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
Köszönöm szépen. Működik.
Meg kell tanulnom az awk használatát, könnyebbé teszi a munkát...:)
- A hozzászóláshoz be kell jelentkezni