it-swarm.com.de

Zeile aus einer Datei entfernen, die in einer anderen benannt ist

Ich habe folgende Liste:

NM_000014 3
NM_000015 0
NM_000016 0
NM_000017 0
NM_000018 0
NM_000019 28
NM_000020 0
NM_000021 0
NM_000022 0
NM_000023 0
NM_000024 8
NM_000025 0
NM_000026 0

Und ich habe eine andere Datei mit nur der ersten Spalte:

NM_000031
NM_000032
NM_000033
NM_000034
NM_000022
NM_000035
NM_000036
NM_000037
NM_000023
NM_000038
NM_000039
NM_000040
NM_000041
NM_000042

Ich möchte die ganzen Zeilen der ersten Datei entfernen, die als die zweite benannt sind. In diesem Fall ist die Ausgabedatei:

NM_000014 3
NM_000015 0
NM_000016 0
NM_000017 0
NM_000018 0
NM_000019 28
NM_000020 0
NM_000021 0
NM_000024 8
NM_000025 0
NM_000026 0

(Entfernen von NM_000022 und NM_00023 mit den entsprechenden Werten)

Vielen Dank!!

Mit awk:

awk 'NR==FNR {a[$0]; next}; {if ($1 in a) next}; 1' f1.txt f2.txt

Geben Sie die Datei mit nur einer einzelnen Spalte als erstem Argument und der zu überprüfenden (ersten Spalte) als zweitem Argument ein.

  • NR==FNR {a[$0]; next}, hier NR==FNR gilt nur für die erste Datei, dann speichern wir jede Zeile im Array a, damit wir den Mitgliedschaftstest für das erste Argument der zweiten Datei durchführen können. dann gehen wir zur nächsten Zeile, ohne die zweite Datei weiter zu bearbeiten

  • {if ($1 in a) next}; 1 wird nur für die zweite Datei ausgeführt, die zu überprüfen ist. Hier wird geprüft, ob das durch Leerzeichen getrennte erste Argument im Array a enthalten ist. Wenn vorhanden, wird zur nächsten Zeile gewechselt, andernfalls wird die Datei gedruckt ganze Linie.

Beispiel:

$ cat f1.txt 
NM_000031
NM_000032
NM_000033
NM_000034
NM_000022
NM_000035
NM_000036
NM_000037
NM_000023
NM_000038
NM_000039
NM_000040
NM_000041
NM_000042

$ cat f2.txt 
NM_000014 3
NM_000015 0
NM_000016 0
NM_000017 0
NM_000018 0
NM_000019 28
NM_000020 0
NM_000021 0
NM_000022 0
NM_000023 0
NM_000024 8
NM_000025 0
NM_000026 0

$ awk 'NR==FNR {a[$0]; next}; {if ($1 in a) next}; 1' f1.txt f2.txt
NM_000014 3
NM_000015 0
NM_000016 0
NM_000017 0
NM_000018 0
NM_000019 28
NM_000020 0
NM_000021 0
NM_000024 8
NM_000025 0
NM_000026 0
6
heemayl

Sie können sed auch mit einer Bash-Schleife verwenden.

Dieser Befehl ändert file1 an der richtigen Stelle (erstellt ein Backup file1.bak) und entfernt jede Zeile, die mit einer beliebigen Zeile beginnt, aus file2:

while read line ; do sed -i.bak "/$line.*/d" file1 ; done < file2
2
Byte Commander

Wie ist das mit 'grep' Befehl hier:)

grep -Fvf oneColumnedFile listFile > outfile
1
αғsнιη