Como intercalar dois arquivos txt com um número alternativo de linhas

4

file1.txt:

1
2
3
4
5
6

arquivo2.txt:

A
B
C
D
E

Saída desejada na proporção de 3: 1 (file3.txt)

1
2
3
A
4
5
6
B

Comandos que tentei:

  1. sed Rfile2.txt file1.txt >file3.txt
  2. paste -d '\n' file1.txt file2.txt >file3.txt
por puvi14 23.08.2017 / 09:10

3 respostas

8

com paste :

paste -d '\n' <file1.txt - - - file2.txt

embora continue mantendo as linhas depois que um dos arquivos estiver esgotado, se ainda houver linhas no outro arquivo, como em sua amostra.

com awk :

awk '{print}; NR % 3 == 0 {getline < "file2.txt"; print}' file1.txt

Ou o equivalente sed do GNU:

sed '3~3 R file2.txt' file1.txt

Desta vez, pare assim que file1.txt estiver esgotado, mas continue se file2.txt estiver esgotado (e imprima linhas vazias na variante awk e nada na variante% GNUsed).

Para parar assim que um dos arquivos esgotar:

awk '{print}
     NR % 3 == 0 {
       if ((getline < "file2.txt") <= 0) exit
       print
     }' file1.txt
    
por 23.08.2017 / 09:29
4
$ awk '{print} (FNR % 3)==0{getline<"file2.txt"; print}' file1.txt
1
2
3
A
4
5
6
B

Como funciona

  • print

    Isto imprime cada linha do arquivo1.txt.

  • (FNR % 3)==0{ getline <"file2.txt"; print}

    Em cada terceira linha, isso imprime uma linha do arquivo2.txt.

Alternativa

Algumas pessoas se opõem strongmente ao uso do getline do awk. Nesse caso:

$ awk 'FNR==NR{a[NR]=$0;next} {print} (FNR % 3)==0{print a[FNR/3]}' file2.txt file1.txt
1
2
3
A
4
5
6
B

Como funciona

  • FNR==NR{a[NR]=$0;next}

    Durante a leitura do primeiro arquivo, file2.txt , salvamos suas linhas na matriz a e, em seguida, pulamos o restante dos comandos e pulamos para a linha de entrada next .

  • print

    Se chegamos aqui, então estamos lendo o segundo arquivo, file1.txt e imprimimos sua linha.

  • (FNR % 3)==0 {print a[FNR/3]}

    Se o número da linha no arquivo file1.txt for um múltiplo par de 3, então imprimimos a linha do arquivo file2.txt cujo número da linha é um terço da linha atual em file1.txt .

por 23.08.2017 / 09:20
0

Usando python:

Código:

with open(sys.argv[1], 'rU') as f1, open(sys.argv[2], 'rU') as f2:
    while f1 or f2:
        for i, line in enumerate(f1):
            print line.strip()
            if i == 2:
                break
        if f2:
            try:
                print(next(f2).strip())
            except StopIteration:
                f2 = None

Resultados:

1
2
3
A
4
5
6
B
    
por 23.08.2017 / 09:30