2016-08-01 13 views
0

Ich habe eine tabulatorgetrennte Datei mit Spalte 1 als ID und Spalte 2 als Information. Ich habe eine zweite Datei mit einer Liste von IDs, die aus der ersten Datei entfernt werden müssen. Wenn ich grep verwende, bekomme ich entweder eine Kopie der ersten Datei ohne Änderungen oder ich bekomme eine leere Datei mit -v mit -F -f "file2.txt" Flags/Argumenten. Meine Frage ist: Wie verwende ich file2.txt, um die IDs davon mit file1 zu vergleichen, um diese Zeilen aus file1 zu entfernen, um sie in file3 auszugeben.Zeile aus tabulatorgetrennter Datei entfernen mit grep -v

awk 'BEGIN{RS=">"}NR>1{sub("\n","\t"); gsub("\n",""); print RS$0}' $1 > fasta.tab 
grep -F -f $2 fasta.tab -v >rmOutput.tab 
tr '\t' \n' <rmOutput.tab >rmOutput.fas 
echo Runtime Complete 

Zeile 1: Erstellen Sie Tabula delim Datei von Eingang 1 Zeile 2: Überprüfen Eingang 2 für die Spiele und entfernen Sie diese aus dem Reiter-delim Datei Zeile 3: neu Format des Eingangs 1 (Aus Gründen der Klarheit)

EDIT: Probe I/O

Eingang 1 (tabula~~POS=TRUNC delim - nach Zeile 1):

ID1 Info1 
ID2 Info2 
ID3 Info3 
ID4 Info4 
ID5 Info5 

Eingang 2 (IDs gelöscht) werden:

ID2 
ID4 
ID5 

gewünschte Ausgabe (ab Zeile 2)

ID1 Info1 
ID3 Info3 
+0

Was ist der Sinn des awk + grep + tr + echo Shell-Skripts oben in der Frage? Auch Sie erwähnen "nach Zeile 2" und ähnlich, aber es ist überhaupt nicht klar, wie sich das auf Ihre Eingabe/Ausgabe bezieht - erklären Sie das. –

+0

Die Eingabedatei ist eine Sequenzdatei.Das ist das Format > SeqID Sequenz usw. der Punkt ist, um die Datei in eine große Tab-Delim-Datei zu verwandeln. Es war ein Skript, das mir gegeben wurde, also bin ich mir nicht sicher, ob es das effizienteste/praktischste ist. –

+0

Sagen Sie, dass die von Ihnen gepostete Beispieleingabe nicht wirklich im Eingabeformat ist, das Sie behandeln müssen? –

Antwort

0
awk 'NR==FNR{a[$0];next} !($1 in a)' input2 input1 
0

Wenn es nicht zu viele verschiedene IDs es in einer einfachen Schleife zu löschen, führen, removing lines inline with sed:

# bash 
cp file1.txt out_file.txt 
for rem in `cat file2.txt` 
do 
    echo $rem 
    sed -i "/$rem/d" out_file.txt 
done 

#fish 
cp file1.txt out_file.txt 
for rem in (cat file2.txt) 
    echo $rem 
    sed -i "/$rem/d" out_file.txt 
end 

PS

antizipierend etwas Flamme von Menschen mit kryptischen bash Prozess Substitutionen und peinliche awk Skripte, lassen Sie mich sagen: in der Tat sollten Sie nicht diese sehr einfach und angenehm zu lesen Algorithmus, wenn Sie viele verschiedene IDs zu entfernen haben, jedoch nach The Holy Unix Philosophy Principles :

  1. Fancy Algorithmen sind instabiler als einfache, und sie sind viel schwieriger zu implementieren. Verwenden Sie einfache Algorithmen sowie einfache Datenstrukturen. (C) Rob Pike

Und ein wichtiger ein:

Regel Klarheit: Klarheit ist besser als Klugheit.

Da die Wartung so wichtig und so teuer ist, schreiben Sie Programme so, als ob die wichtigste Kommunikation nicht der Computer ist, der sie ausführt, sondern den Menschen, die den Quellcode in Zukunft lesen und pflegen werden (einschließlich Sie selbst)).

Und auch ich füge ein Schnipsel mit fish Code hinzu.

+0

Lesen Sie [warum-verwendet-a-Shell-Schleife-zu-Prozess-Text-in Betracht gezogen-schlechte-Praxis] (http://unix.stackexchange.com/questions/169716/why-is-using-a- shell-loop-to-process-text-into-bad-practice), um einige, aber nicht alle Gründe zu verstehen, warum man das nie tun sollte. –

+0

Eingabedatei 1 kann zwischen 20 und 1200 Zeilen liegen, wobei Eingang 2 alles von 1 bis zu dem Eingang 1 von -1 sein kann. –

+0

@MichaelBale gut, dann ist es zu viel für eine Schleife. – xealits