Puncte:4

Cum combin două fișiere excluzând liniile care există în ambele fișiere?

drapel it

Am 2 fișiere care nu pot fi sortate. Ambele au o listă de cuvinte pe rând. Încerc să compar ambele fișiere și să creez unul nou fără orice linii duplicate care se potrivesc între ambele fișiere. Aceasta înseamnă că, dacă o linie din fișierul A este găsită în fișierul B, aceasta nu ar trebui să apară ca rezultat de ieșire.

Există o problemă uriașă cu multe întrebări și site-uri care spun în titlurile lor „Ștergerea duplicatelor”, când de fapt este „Îmbinarea duplicatelor și afișarea unuia unic”. Aceste 2 puncte sunt foarte diferite. Unul nu este de fapt ștergerea liniilor duplicate, ci doar îmbinarea lor.

Pentru acest caz particular, trebuie să LE ȘTERG pe bune. Deci, dacă se găsesc în ambele fișiere, nu apar ca rezultat.

Am testat com deja și asta eșuează. De asemenea, am testat alte câteva cazuri precum awk, grep pe care le-am văzut. Regulile pentru ambele fișiere sunt următoarele:

  • Au dimensiuni diferite (nu au aceeași cantitate de linii)
  • Pentru a fi un duplicat, compară întreaga linie cu fiecare și cu toate celelalte linii din celălalt fișier
  • Fișierele nu pot fi sortate

Iată câteva informații despre fișiere, acestea conțin o listă de e-mailuri, un e-mail pe linie. Desigur, deoarece nu au aceeași dimensiune, nu înseamnă că vor avea toate e-mailurile la fel, dar au unul în celălalt toate e-mailurile unice. Doar că unele e-mailuri ar putea fi în ambele fișiere. Pentru cazurile în care e-mailurile sunt pe ambele fișiere, rezultatele de ieșire nu ar trebui să arate acele e-mailuri.

FedKad avatar
drapel cn
Care este motivul pentru care „_Fișierele nu pot fi sortate_”?
N0rbert avatar
drapel zw
Nu sunt sigur, dar puteți încerca utilitarul `dwdiff` pentru comparație; consultați https://askubuntu.com/a/1073389/66509 pentru referință.
drapel hr
Pot apărea duplicate *în* oricare fișier? În ce ordine ar trebui îmbinate rezultatele? Vă rugăm să luați în considerare furnizarea unui exemplu minim.
Luis Alvarado avatar
drapel it
@steeldriver, nu există duplicate (mulțumesc lui Dumnezeu) pe fiecare fișier. Toate sunt unice)
drapel hr
*„dacă se găsește o linie în fișierul A în fișierul B, nu ar trebui să se afișeze ca rezultat de ieșire”* sună ca `grep -vFxf fișierB fișierA`, în timp ce *” dacă se găsesc în ambele fișiere, nu se afișează ca un rezultat"* sună ca `awk '!seen[$0]++' fileA fileB`. Aici ar fi util un exemplu scurt, reprezentativ.
Luis Alvarado avatar
drapel it
@steeldriver Mulțumesc prietene, le-am testat pe amândouă, dar fără noroc. Ele arată în continuare ieșirea greșită. Deci, de exemplu, un fișier are 700 de e-mailuri, altul are 80 de e-mailuri. Știu cu siguranță că aproape toate cele 80 de e-mailuri sunt duplicate față de cele 700, așa că numărul de ieșire ar trebui să fie în jur de 620 de e-mailuri.
Luis Alvarado avatar
drapel it
Corectare, tocmai l-am testat din nou pe primul dar am observat f la sfârșit. Am făcut-o și a funcționat. Dar cel awk nu a arătat rezultatele corecte, deși grep-ul tău a făcut-o. Dacă ați putea, vă rog, puneți asta ca răspuns, deoarece acesta a funcționat de fapt pentru mine după câteva ore.
Puncte:1
drapel cn

Există modalități mai eficiente, dar aici este A soluţie. Nu eram sigur cum ai vrea ca fișierele să fie îmbinate. Deci, în această soluție sunt scrise linii distincte din fișierul 1 în noul fișier, apoi liniile distincte din fișierul 2 sunt scrise în noul fișier.

# remove_dupes.py
din sys import argv

infile1 = open( str(argv[1]), "r" )
infile2 = open( str(argv[2]), "r" )
încerca:
    outfile = open( str(argv[3]), "w" )
cu excepția (IndexError):
    outfile = open('out', 'w')


if1_arr = infile1.readlines()
if2_arr = infile2.readlines()
tmp_arr = if2_arr



exclude = []
pentru linia din if1_arr:
    linia if în if2_arr:
        exclude.append(linie)
    altceva:
        outfile.write(linie)

pentru linia din if2_arr:
    dacă linia nu este exclusă:
        outfile.write(linie)

infile1.close()
infile2.close()
outfile.close()

A alerga:

python3 remove_dupes.py <fișier1> <fișier2> <fișier_ieșire>

Dacă doriți să transformați acest lucru într-un instrument de linie de comandă mai rapid, mutați scriptul într-un loc pe termen lung și adăugați următoarea linie în fișierul dvs. .bashrc, .bash_aliases, .zshrc sau echivalent.

alias mydiff='python3 <path_to_script> '

Puteți înlocui „mydiff” cu orice doriți să-l numiți. După aceea, puteți rula scriptul cu:

mydiff <fișier1> <fișier2> <fișier_ieșire>

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.