Come interfogliare le linee di due o più file?


10

Ho provato a ottenere l'output di 2 file in un singolo file. Ho provato sotto il comando:

cat file1 file2

ma qui i file2dati vengono aggiunti file1.

Ciò di cui ho bisogno è la file1prima riga seguita dalla file2prima riga e la file1seconda riga seguita dalla file2seconda riga ecc.

Qualcuno può dirmi come farlo in modo semplice?

Risposte:


17

C'è un'app per questo!

$ cat file1
file1 line1
file1 line2

$ cat file2
file2 line1
file2 line2

Ora, se passi questi file come argomenti a paste:

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

Se per "file1 prima riga seguita da file2 prima riga e file1 seconda riga seguita da file2 seconda riga ecc.", Vuoi dire che vuoi una nuova riga tra ogni riga incollata, regola semplicemente l' -dopzione (delimitatore).

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

2

POSIX Awk; funziona con una quantità arbitraria di file e i file non devono nemmeno avere la stessa quantità di righe. Lo script continua fino a quando tutti i file sono fuori linea:

BEGIN {
  do {
    br = ch = 0
    while (++ch < ARGC)
      if (getline < ARGV[ch]) {
        printf ch < ARGC - 1 ? $0 FS : $0 RS
        br = 1
      }
  } while (br)
}

C'è un problema con esso, se l'input contiene caratteri '%' ha provato a valutarli all'interno di printf. Il mio aggiornamento sarebbe (non sono sicuro che sia perfettamente corretto):printf "%s", ((ch < ARGC - 1) ? $0 FS : $0 RS)
— Scala William

0

Soluzione rapida di bash

# 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 file1 file2 file3 file4


-2
paste -d '\n' file1 file2 > file3

dove file1e file2sono i file di input e file3sarà l'output creato.


1
Benvenuti nello scambio di stack U&L! Questa risposta è quasi identica alla risposta di Terdon . Nei casi in cui ritieni di poter migliorare una risposta, ma non fornisci informazioni sostanzialmente nuove, ti preghiamo di considerare di proporre una modifica a una risposta esistente . Le risposte sono anche riordinate in base al voto, quindi ogni risposta dovrebbe essere autonoma o riferirsi ad altra risposta. Ecco perché gli oneliners della shell dovrebbero essere accompagnati da una descrizione che spieghi il loro funzionamento.
— Thomas Nyman,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.