(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))