Ich möchte die Nummern von file verwenden, whitelist.txt
um eine eindeutige Identifikationsnummer aus file zu erhalten, list.txt
basierend 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.txt
Datei von ie 2
in 2p
, was outer anweist, sed
diese 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
%h
Inhalt derwhitelist.txt
Datei aus. Dies ist das erste Argument, das an den Code übergeben werden mussPerl
. Beachten Sie, dass derqx[]
Operator nichts anderes als derbackquote
Operator ist.Dann drucken wir die Zeilen des 2. Arguments, nämlich
list.txt
die Datei, deren Zeilennummern ein Mitglied von sindhash
%h
. Hinweis: Da $. immer numerisch UND > 0 ist, können wir einfach$h{$.}
statt propah verwenden.exists $h{$.}
Ergebnisse
172363
612851
172418
19
72457