Musterabgleich zwischen zwei Dateien in Linux?

1146
user28167

Ich habe zwei .rtf-Datei .... Die erste hat folgenden Inhalt:

Apfel, Orange, Banane, Nudel, Chip

Die zweite Datei sieht ungefähr so ​​aus:

 Apple I love eat Apple. Banana I hate Banana. Zoo I want to go Zoo. Noodle Noodle can be a very very very very very very very very very very very long, but still is one line. Chip Don't eat so many chip.  Orange Orange is great, not Apple plx. Noodle Water Drinking water is boring. 

Die erste Datei ist ein "Schlüssel" der zweiten Datei.

In der zweiten Datei ist das erste Wort der Schlüssel jeder Zeile.

Jeder Schlüssel und Satz in der zweiten Datei haben NUR eine Zeile. Die zweite Datei enthält viele Zeilen mit Schlüsseln, aber nicht alle Schlüssel sind vorhanden file1, aber file1der Schlüssel MUSS in der zweiten Datei sein.

Wie kann ich das Ergebnis so erhalten: (Müssen nach dem Schlüssel sortiert werden file1)

 Apple, Apple I love eat Apple.  Orange, Orange is great, not Apple plx. Banana, I hate Banana.  Noodle, can be a very very very very very very very very very very very long, but still is one sentence.  Chip, Don't eat so many chip. 
0

4 Antworten auf die Frage

1
nik

Ich werde einige Annahmen treffen (mit denen Sie in Ihrer Frage einverstanden zu sein scheinen).

  1. Schlüsseldatei ist eine CSV von Schlüsseln (durch Kommas getrennte Liste von Schlüsselwörtern)
  2. Die Datendatei enthält Schlüssel als erste Wörter, die in der ersten Spalte beginnen
    • Diese Einschränkung kann mit einigen weiteren Elementen im Skript verwaltet werden
  3. Datendatei hat keine zwei Zeilen, die mit demselben Schlüsselwort beginnen
    • Wenn diese Einschränkung gebrochen ist, erhalten Sie alle übereinstimmenden Zeilen,
      wenn Sie nach dem Schlüssel suchen.
    • das kann mit einem " | tail -1" behandelt werden, um nur die erste Übereinstimmung anzuzeigen (sagen wir)
  4. Sie fangen an, rtfDateien zu sagen, markieren die Frage jedoch als text.
    Wenn Sie Dateien im Rich-Text-Format haben, sollten Sie sie zu diesem Zweck in Textdateien konvertieren.

Hier ist ein Skript für dich,

#! / bin / bash IFS = "," # -> um nach durch Kommas getrennten Wörtern in key.txt zu suchen  für k in $ (sed's | || 'key.txt) # -----------> um die Suche zu erleichtern tun grep "^ $ k" data.txt # ----> Suchen Sie nach Schlüsselwörtern, die am Anfang jeder Zeile übereinstimmen erledigt 

Hier key.txtist Ihre erste Datei und data.txtIhre zweite Datei.
Die forSchleife sortiert die Ausgabe in der Reihenfolge der Tasten.
Der sedBefehl entfernt alle Leerzeichen in der key.txtDatei, um die Suche zu vereinfachen.

Update für nicht-englische Zeichen (weshalb Sie scheinbar RTF-Datei sagen):
Suchen iconvSie nach RTF-8 und konvertieren Sie sie in UTF-8 grep.
Wenn Sie dies tun möchten, sollte Ihre Frage umformuliert werden als

"Wie grep ich in Rich-Text-formatierten Dateien (unter Linux)?"

0
user36322

Eine weitere Option, vorausgesetzt, Ihre Datendatei ist 'data.txt':

for k in Apple Orange Banana Noodle Chip; do echo -n "$k, "; grep "^$k" data.txt; done 
Einige Fragen zu TXT: Kann der TXT nicht-englische Zeichen / Wörter anzeigen? user28167 vor 14 Jahren 0
0
drewk

Dieses Perl-Skript macht das:

#!/usr/bin/perl use strict; use warnings;  open (my $f1, '<', $ARGV[0]) || die "cannot open $ARGV[0] $!\n"; open (my $f2, '<', $ARGV[1]) || die "cannot open $ARGV[1] $!\n";  my $line=join('',<$f1>); my @f2=<$f2>;  foreach my $e1 (sort split /, /,$line) { foreach my $e2 (@f2) { print "$e1, $e2" if ($e2=~/^$e1/); } } 
0
Dennis Williamson

Wenn Sie das Ergebnis nicht in der Reihenfolge der Schlüsseldatei sortiert benötigen:

sed 's/, /\n/g' keyfile.txt | grep -f - datafile.txt 

Um die Sortierung durchzuführen, können Sie Folgendes tun (in Bash):

sed 's/, /\n/g' keyfile.txt | grep -f - datafile.txt | sort | join -1 2 <(sed 's/, /\n/g' keyfile.txt | nl | sort -k2) - | sort -k2 | cut -d' ' -f1,3-