Wie verschachteln Sie die Zeilen von zwei oder mehr Dateien?

10

Ich habe versucht, die 2 Dateien in einer einzigen Datei auszugeben. Ich habe unten Befehl versucht:

cat file1 file2

aber hier file2hängen Daten an file1.

Was ich brauche, ist die erste Zeile, file1gefolgt von der file2ersten Zeile, und die file1zweite Zeile, gefolgt von der file2zweiten Zeile usw.

Kann mir jemand sagen, wie das auf einfache Weise geht?

user73553
quelle

Antworten:

17

Dafür gibt es eine App!

$ cat file1
file1 line1
file1 line2

$ cat file2
file2 line1
file2 line2

Wenn Sie diese Dateien als Argumente übergeben an paste:

$ paste -d' ' file1 file2
file1 line1 file2 line1
file1 line2 file2 line2

Wenn mit "Datei1 1. Zeile gefolgt von Datei2 erste Zeile und Datei1 zweite Zeile gefolgt von Datei2 zweite Zeile usw." gemeint ist, dass zwischen jeder eingefügten Zeile eine neue Zeile angezeigt werden soll, passen Sie einfach die -dOption (Trennzeichen) an.

$ paste -d'\n' file1 file2
file1 line1
file2 line1
file1 line2
file2 line2
terdon
quelle
2

POSIX Awk; Dies funktioniert mit einer beliebigen Anzahl von Dateien, und die Dateien müssen nicht einmal die gleiche Anzahl von Zeilen haben. Das Skript wird fortgesetzt, bis alle Dateien nicht mehr in Zeilen enthalten sind:

BEGIN {
  do {
    br = ch = 0
    while (++ch < ARGC)
      if (getline < ARGV[ch]) {
        printf ch < ARGC - 1 ? $0 FS : $0 RS
        br = 1
      }
  } while (br)
}
Steven Penny
quelle
Es gibt ein Problem damit: Wenn die Eingabe '%' Zeichen enthält, wurde versucht, diese in printf auszuwerten. Mein Update wäre (ich bin nicht sicher, ob dies vollkommen korrekt ist):printf "%s", ((ch < ARGC - 1) ? $0 FS : $0 RS)
Scala William
0

Schnelle Bash-Lösung

# Takes as many file arguments as needed
function InterleaveFiles {

    local counter=0
    local hasLine=true

    while [ $hasLine == true ]; do
            hasLine=false
            for i in "$@"; do
                    line=$(awk 'NR == num_line {print; exit}' num_line=$((counter+1)) "$i")
                    if [ -n "$line" ]; then
                            echo "$line"
                    hasLine=true
                    fi
            done
            counter=$((counter+1))
    done
}

InterleaveFiles Datei1 Datei2 Datei3 Datei4

Orsiris de Jong
quelle
-2
paste -d '\n' file1 file2 > file3

wo file1und file2sind die Eingabedateien und file3werden die erstellte Ausgabe sein.

Prateek Singh
quelle
1
Willkommen bei der U & L Stack Exchange! Diese Antwort ist fast identisch mit Terdons Antwort . In Fällen, in denen Sie der Meinung sind, dass Sie eine Antwort verbessern können, aber keine wesentlich neuen Informationen bereitstellen, sollten Sie eine Änderung einer vorhandenen Antwort vorschlagen . Die Antworten werden auch basierend auf der Abstimmung neu angeordnet, sodass jede Antwort für sich stehen oder sich auf eine andere Antwort beziehen sollte. Aus diesem Grund sollten Muschel-Oneliner von einer Beschreibung begleitet werden, die ihre Funktionsweise erklärt.
Thomas Nyman