GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Gemeinsame Linien zwischen zwei Dateien?

Für diese Frage gibt es hier bereits Antworten :Gemeinsame Zeilen (Ähnlichkeiten) zweier Textdateien ausgeben (das Gegenteil von diff)?

(5 Antworten)
Vor 3 Jahren geschlossen.

Ich habe den folgenden Code, den ich auf meinem Terminal ausführe.

LC_ALL=C && grep -F -f  genename2.txt hg38.hgnc.bed > hg38.hgnc.goi.bed

Dies gibt mir nicht die gemeinsamen Linien zwischen den beiden Dateien. Was übersehe ich da?

Akzeptierte Antwort:

Verwenden Sie comm -12 file1 file2 um gemeinsame Zeilen in beiden Dateien zu erhalten.

Möglicherweise müssen Sie Ihre Datei auch nach comm sortieren wie erwartet funktionieren.

comm -12 <(sort file1) <(sort file2)

Von man comm :

-1     suppress column 1 (lines unique to FILE1)
-2     suppress column 2 (lines unique to FILE2)

Oder mit grep Befehl müssen Sie -x hinzufügen Option zum Abgleichen der gesamten Linie als Abgleichmuster. Das F Option sagt grep dieses Übereinstimmungsmuster als Zeichenfolge, nicht als Regex-Übereinstimmung.

grep -Fxf file1 file2

Oder mit awk .

awk 'NR==FNR{seen[$0]=1; next} seen[$0]' file1 file2

Dies liest die ganze Zeile von file1 in ein Array namens seen mit dem Schlüssel als ganze Zeile (in awk der $0 stellen die gesamte aktuelle Zeile dar).

Wir haben NR==FNR verwendet als Bedingung, um den verfolgten Block nur für die erste Eingabe fle1 auszuführen nicht Datei2 , weil NR in awk beziehen sich auf die aktuelle Verarbeitungszeilennummer und FNR bezieht sich auf die aktuelle Zeilennummer in all Eingänge. also NR ist für jede Eingabedatei einzigartig, außer FNR ist für alle Eingaben eindeutig.

Der next sagt da awk Restcode nicht fortsetzen und neu beginnen bis NR wan ungleich FNR das bedeutet alle Zeilen von file1 gelesen von awk .

Dann als nächstes seen[$0] wird nur für die zweite Datei2 ausgeführt und für jede Zeile in file2 wird in das Array schauen und diese Zeile dort drucken, wo sie im Array existiert.

Eine weitere einfache Option ist die Verwendung von sort und uniq :

sort file1 file2|uniq -d

Dadurch werden beide Dateien sortiert gedruckt, dann uniq -d druckt nur doppelte Zeilen. ABER dies wird gewährt, wenn es KEINE doppelten Zeilen in beiden Dateien selbst gibt, ansonsten wird unten immer gewährt, selbst wenn es eine doppelte Zeile in beiden Dateien gibt.

uniq -d <(sort <(sort -u file1) <(sort -u file2))

Linux
  1. Linien zwischen (und ausschließenden) zwei Mustern drucken?

  2. Zwei Dateien in zwei Spalten drucken?

  3. Zwei Spalten verschiedener Dateien vergleichen und bei Übereinstimmung drucken?

  4. Linux – Wie lösche ich Dateien, die zwischen zwei Mal erstellt wurden?

  5. Wie lösche ich Dateien, die zwischen zwei Mal erstellt wurden?

So übertragen Sie Dateien zwischen zwei Computern mit den Befehlen nc und pv

So vergleichen Sie zwei Dateien im Linux-Terminal

So synchronisieren Sie Dateien automatisch zwischen zwei Linux-Servern

So erhalten Sie den Unterschied (nur Ergänzungen) zwischen zwei Dateien in Linux

Unterschied in Leerzeichen zwischen zwei Dateien unter Linux

So kopieren Sie eine große Anzahl von Dateien schnell zwischen zwei Servern