Wie kann man gleichzeitig aus zwei Dateien lesen und sie Zeile für Zeile ausdrucken, Bash?

Wie kann man gleichzeitig aus zwei Dateien lesen und sie Zeile für Zeile ausdrucken, Bash?

Ich möchte ein Skript schreiben, das als Argumente zwei Dateien F1 und F2 hat und diese abwechselnd druckt; zuerst wird die erste Zeile von F1 geschrieben, dann die zweite Zeile von F2'2 und so weiter. Wenn eine der Dateien weniger Zeilen hat als die andere, soll das Skript, wenn wir mit dem Drucken der kürzeren fertig sind, die längste bis zum Ende schreiben.

Meine Idee war:

1) Überprüfen, ob es nicht 2 Argumente gibt -> echo und beenden 2) Überprüfen, ob F1 oder F2 keine Dateien sind -> echo und beenden 3) Text:

exec 3 < $1
exec 4 < $2
i=0
j=1
while read -u 3 line && ((i==0))
do
echo line; echo
 ((i++))
((j--))
    while read -u 4 line && ((j==0))
    do
        echo line; echo
 ((j++))
((i--))
   done
 done
 exit $?

Zweifel: Dies würde nur funktionieren, wenn beide Dateien die gleiche Zeilenanzahl haben. Wie kann ich dies verbessern, um diese Lösung auf Dateien unterschiedlicher Größe auszudehnen?

Antwort1

Sie brauchen kein Shell-Skript. Sie können dies direkt mit tun paste, das istspezifiziert durch POSIX:

paste -d '\n' file1 file2

Allerdings verarbeitet es unterschiedliche Zeilenzahlen nicht so, wie Sie es beschreiben. Um die Spezifikationen zu zitieren:

Wenn bei einer oder mehreren Eingabedateien, aber nicht bei allen Eingabedateien, ein Dateiende festgestellt wird,Pastesoll sich so verhalten, als ob leere Zeilen aus den Dateien gelesen wurden, bei denen das Dateiende erkannt wurde....

Ich persönlich denke, dass es ein Fehler wäre, das Verhalten so zu machen, wie Sie es in Ihrer Frage beschreiben. Sie könnten in Zeile 24 der Ausgabe nicht erkennen, ob es von file1oder kam file2. Beim tatsächlichen Verhalten von pastewürden Sie wissen, dass es von kam file2, da es eine gerade Zeilennummer der Ausgabe ist.

Sie können die Ausgabe tr -s '\n'folgendermaßen weiterleiten:

paste -d '\n' file1 file2 | tr -s '\n'

Aber wenn estatsächlichWenn in einer der Dateien leere Zeilen vorhanden sind, erhalten Sie nicht das erwartete Ergebnis.

verwandte Informationen