Mesclar linhas alternativas de dois arquivos

9

Arquivo1:

.tid.setnr := 1123 
.tid.setnr := 3345 
.tid.setnr := 5431
.tid.setnr := 89323

Arquivo2:

.tid.info := 12
.tid.info := 3
.tid.info := 44
.tid.info := 60

Arquivo de saída:

.tid.info := 12
.tid.setnr := 1123
.tid.info := 3
.tid.setnr := 3345
.tid.info := 44
.tid.setnr := 5431
.tid.info := 60
.tid.setnr := 89323
    
por pmaipmui 17.06.2015 / 09:47

5 respostas

22

Usando paste :

paste -d \n file2 file1
    
por 17.06.2015 / 10:14
5

Outra solução para o awk:

awk '{print; getline < "file1"; print}' file2
    
por 17.06.2015 / 12:13
5

A paste solution é a mais portátil e eficiente. Só estou mencionando essa alternativa caso você prefira o comportamento no caso em que os dois arquivos não tenham o mesmo número de linhas:

Com o GNU sed :

sed Rfile1 file2

Se file1 tiver menos linhas que file2 , quando file1 estiver esgotado, sed não produzirá nada para ele (em oposição a linhas vazias para paste ).

Se file1 tiver mais linhas que file2 , essas linhas extras serão descartadas (em vez de imprimir linhas vazias para file2 com paste ).

$ paste a b
1       a
2       b
3
4
$ paste -d \n a b
1
a
2
b
3

4

$ sed Rb a
1
a
2
b
3
4
$ sed Ra b
a
1
b
2
    
por 17.06.2015 / 18:36
4

Usando awk ( gawk , nawk , mawk ):

awk 'NR==FNR {x[FNR]=$0;next} {print x[FNR]"\n"$0}' file2 file1 > outputfile
  • NR==FNR {x[FNR]=$0;next} : NR==FNR é correspondido apenas se o número do registro atual for igual ao número de registro do arquivo atual (portanto, ele corresponde apenas ao processar o primeiro arquivo): armazena o registro atualmente processado na matriz x em um índice igual para o número de registro do arquivo atual e pula o registro atual
  • {print x[FNR]"\n"$0} : imprime o conteúdo da matriz x em um índice igual ao número de registro do arquivo atual seguido por uma nova linha e pelo conteúdo do registro atual
~/tmp$ cat file1
.tid.setnr := 1123
.tid.setnr := 3345
.tid.setnr := 5431
.tid.setnr := 89323
~/tmp$ cat file2
.tid.info := 12
.tid.info := 3
.tid.info := 44
.tid.info := 60
~/tmp$ awk 'NR==FNR {x[FNR]=$0;next} {print x[FNR]"\n"$0}' file2 file1
.tid.info := 12
.tid.setnr := 1123
.tid.info := 3
.tid.setnr := 3345
.tid.info := 44
.tid.setnr := 5431
.tid.info := 60
.tid.setnr := 89323
    
por 17.06.2015 / 09:59
-1

A solução mais fácil é fornecida abaixo.

cat file1 >> file2

ou

cat file2 >> file1
    
por 11.07.2016 / 06:05