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.