Mam dwa pliki. Jeden ma dwie kolumny, ref.txt. Druga ma trzy kolumny, file.txt.

W ref.txt,

1  2
2  3
3  5

W pliku.txt,

1  2  4   <---here matching
3  4  5
6  9  4
2  3  10  <---here matching
4  7  9
3  5  7   <---here matching

Chciałbym porównać dwie kolumny dla każdego pliku, a następnie wydrukować tylko linie w pliku.txt pasujące do ref.txt.

Więc wyjście powinno być,

1  2  4
2  3  10
3  5  7

Myślałem, że dwa porównania słownika jak,

mydict = {}
mydict1 = {}

with open('ref.txt') as f1:
     for line in f1:
         key, key1 = line.split()
         sp1 = mydict[key, key1]

with open('file.txt') as f2:
      for lines in f2:
          item1, item2, value = lines.split()
          sp2 = mydict1[item1, item2]
          if sp1 == sp2:
             print value

Jak mogę odpowiednio porównać dwa pliki z słownikiem lub innymi?

Znalazłem jakiś kod Perla i Pythona, aby rozwiązać tę samą liczbę kolumn w obu plikach.

W moim przypadku jeden plik ma dwie kolumny, a druga ma trzy kolumny.

Jak porównać dwa pliki i tylko wydrukować pasujące wartości?

3
Chang Woon Jang 23 listopad 2013, 02:10

3 odpowiedzi

Najlepsza odpowiedź

Oto inna opcja:

use strict;
use warnings;

my $file = pop;
my %hash = map { chomp; $_ => 1 } <>;

push @ARGV, $file;

while (<>) {
    print if /^(\d+\s+\d+)/ and $hash{$1};
}

Zastosowanie: perl script.pl ref.txt file.txt [>outFile]

Ostatni, opcjonalny parametr kieruje wyjściem do pliku.

Wyjście na twoich zestawach danych:

1  2  4
2  3  10
3  5  7

Mam nadzieję że to pomoże!

1
Kenosis 22 listopad 2013, 23:38
grep -Ff ref.txt file.txt

Wystarczy, jeśli ilość białego znaku między znakami jest taka sama w obu plikach. Jeśli nie, możesz zrobić

awk '{print "^" $1 "[[:space:]]+" $2}' | xargs -I {} grep -E {} file.txt

Łącząc trzy moje ulubione narzędzia: awk, grep i xargs ... Ta ostatnia metoda zapewnia również, że mecz wystąpi tylko na początku linii (porównują kolumnę 1 z kolumną 1 i kolumna 2 z kolumną 2).

1
Floris 22 listopad 2013, 22:39

Oto zmieniona i komentowana wersja, która powinna pracować nad większym zestawem danych:

#read in your reference and the file
reference = open("ref.txt").read()
filetext = open("file.txt").read()

#split the reference file into a list of strings, splitting each time you encounter a new line
splitReference = reference.split("\n")

#do the same for the file
splitFile = filetext.split("\n")

#then, for each line in the reference,
for referenceLine in splitReference:

  #split that line into a list of strings, splitting each time you encouter a stretch of whitespace
  referenceCells = referenceLine.split()

  #then, for each line in your 'file',  
  for fileLine in splitFile:

    #split that line into a list of strings, splitting each time you encouter a stretch of whitespace
    lineCells = fileLine.split()

    #now, for each line in 'reference' check to see if the first value is equal to the first value of the current line in 'file'
    if referenceCells[0] == lineCells[0]:

      #if those are equal, then check to see if the current rows of the reference and the file both have a length of more than one
      if len(referenceCells) > 1:
        if len(lineCells) > 1:

          #if both have a length of more than one, compare the values in their second columns. If they are equal, print the file line
          if referenceCells[1] == lineCells[1]:
            print fileLine

Wynik:

1  2  4
2  3  10
3  5  7
1
duhaime 22 listopad 2013, 23:22