Verwenden von Zahlen in Datei A, um eine eindeutige ID aus Datei B zu erhalten, basierend auf der in Datei A angegebenen Reihenfolge

Verwenden von Zahlen in Datei A, um eine eindeutige ID aus Datei B zu erhalten, basierend auf der in Datei A angegebenen Reihenfolge

Ich möchte die Nummern von file verwenden, whitelist.txtum eine eindeutige Identifikationsnummer aus file zu erhalten, list.txtbasierend auf der durch file angegebenen Reihenfolge whitelist.txt. Beispiel:

$ cat whitelist.txt:  
2  
5  
7  
10   
11
(+8,000 more lines)

$ cat list.txt  
2  
172363  
14  
17  
612851  
172414  
172418  
172419  
172424  
19  
72457  
(+ 150,000 more lines)

So dass ich zu einer neuen Datei weiterleiten kann:

$ cat newfile.txt  
172363  
612851  
172418  
19   
72457  
(+8,000 more lines)

HINWEIS: Diese Frage wurde geändert. Die folgenden Antworten vor dem 5. Mai 2017 basierten auf Eingabebeispielen ( list.txt), die als (z. B. erste Zeile) (anstatt nur der Zahl 2) formatiert waren >CLocus_2_Sample_und der Dateiname war file.fa(nicht file.txt).

Antwort1

Versuchen Sie auf der Grundlage der überarbeiteten Daten Folgendes:

$ sed -nf <(sed 's/.*/&p/g' whitelist.txt) list.txt >newfile.txt

Dies transformiert die Einträge der whitelist.txtDatei von ie 2in 2p, was outer anweist, seddiese Zeile zu drucken. 2==> ist gleich sed -n '2p'==> druckt die zweite Zeile.
Dasselbe passiert für alle Einträge von whitelist.txt, wodurch ein Sed-Skript erstellt wird (das outer sed mit Prozesssubstitution versorgt), das 2p, 5p, 7p, usw. enthält, und diese Zeilen von list.txt werden gedruckt.

Alternative: Verarbeiten Sie die Datei whitelist.txt vorab:

sed 's/.*/&p/g' whitelist.txt >whitelist2.txt  #or sed -i '....' whitelist.txt to overwrite whitelist.txt
sed -nf whitelist2.txt list.txt # you can redirect output to >newfile.txt

Antwort2

Als Antwort auf Ihre letzte Überarbeitung:

awk 'NR==FNR{z[$1]; next}FNR in z' whitelist.txt list.txt >newfile.txt

Antwort3

Mit den neuen Spezifikationen, von denen Sie sprechen, müssen wir Folgendes ändern:

perl -e '
   $h{s/\n//r}++ for qx[cat ${\+shift}];
   $h{$.} && print while <>;
' whitelist.txt list.txt

Erläuterung

  • Füllen Sie zuerst den hash %hInhalt der whitelist.txtDatei aus. Dies ist das erste Argument, das an den Code übergeben werden muss Perl. Beachten Sie, dass der qx[]Operator nichts anderes als der backquoteOperator ist.

  • Dann drucken wir die Zeilen des 2. Arguments, nämlich list.txtdie Datei, deren Zeilennummern ein Mitglied von sind hash %h. Hinweis: Da $. immer numerisch UND > 0 ist, können wir einfach $h{$.}statt propah verwenden.exists $h{$.}

Ergebnisse

172363
612851
172418
19
72457

verwandte Informationen