
Ich habe eine Reihe von .txt-Dateipaaren. In jedem Dateipaar enthält Datei1 eine einzelne Ganzzahl und Datei2 mehrere Textzeilen. In dem Skript, das ich schreibe, möchte ich die Ganzzahl in Datei1 verwenden, um anzugeben, wie viele Zeilen von oben aus Datei2 entfernt werden sollen, und diese Zeilen dann in eine andere Datei schreiben. Ich verwende gnu-parallel, um dies auf vielen Dateipaaren parallel auszuführen.
Eine einfache Möglichkeit hierfür scheint zu sein, den Inhalt von Datei1 als Parameter für die -n
Option von zu übergeben head
– ist das möglich? Ich habe versucht, xargs
und zu verwenden cat File1
, aber beides funktioniert nicht.
Ein Beispiel für ein Dateipaar:
File1:
2
File2:
AAA
BBB
CCC
DDD
Gewünschte Ausgabe:
File3:
AAA
BBB
Wenn ich gnu-parallel nicht verwenden würde, könnte ich den Inhalt von File1 einer Variablen zuweisen (obwohl ich nicht weiß, ob ich das an head
die -n
Option von übergeben könnte?); parallel scheint {}
diesen Ansatz jedoch zu verkomplizieren.
Bei Bedarf kann ich weitere Informationen bereitstellen.
Antwort1
Benutze einenBefehlsersetzung.
head -n "$(cat File1)" File2
Bei einer Befehlsersetzung wird die Ausgabe des Befehls in eine Befehlszeile eingefügt. Zeilenumbrüche am Ende der Ausgabe werden entfernt, was genau das ist, was Sie hier benötigen.
Alternativ können Sie in Bash (aber nicht in anderen Sh-Varianten) denmapfile
integriert, um eine Datei zeilenweise zu laden.
mapfile lines <File1
head -n "${lines[0]}" File2
Die Zeilen werden in ein Array geladen, daher sind die ZeilennummernNist . Für die erste Zeile können Sie in Bash auch schreiben .${lines[n]}
$line
Antwort2
Erweiterung der Antwort von Gilles:
parallel 'head -n "$(cat {1})" {2}' ::: File1s* :::+ Corresponding_File2s*
Sie haben wahrscheinlich viele File1s, die Sie mit File2s verknüpfen möchten. Das erledigt :::+.