Mesclar arquivos linha por linha

0

Por exemplo, eu tenho dois arquivos:

FileA.txt

1.

2.

3.

FileB.txt

ABC

DEF

GHI

E quero mesclar para obter:

Output.txt

1.ABC

2.DEF

3.GHI

Eu preciso mesclar cada linha, colocando o conteúdo de um arquivo no início da linha e o conteúdo do outro arquivo depois dele. Eu não posso fazer isso manualmente, já que existem mais de 30 mil linhas. Estou no Windows, mas posso instalar o Linux, se necessário.

Eu pesquisei neste site e na internet em geral, mas só encontrei mensagens realmente antigas e obsoletas, soluções que mesclam vários arquivos, mas não linha por linha, ou que exigem também muito conhecimento de codificação, o que me falta. Eu também tentei usar o excel para mesclar duas colunas, mas não consigo contornar o limite de 256 caracteres. Se já existe uma resposta para isso, desculpe, eu perdi isso. Qualquer ajuda é apreciada. Obrigado.

    
por Kard Nails 15.05.2018 / 11:59

6 respostas

3

Use o comando paste , por exemplo,

$ paste FileA.txt FileB.txt 
1.  ABC
2.  DEF
3.  GHI

Nota: Adicione -d' ' para evitar adicionar espaço entre as colunas.

Para redirecionar a saída para o novo arquivo, anexe: > NewFile.txt .

No Windows, você pode instalar o Git Shell ou Cygwin . Ou use o Docker para Windows .

    
por 15.05.2018 / 17:35
1

No linux, um comando simples aproveitando o diff (que está instalado no praticamente todo sistema unix / linux por padrão) e seu sinal -y (comparação lado a lado) e sed que remove espaços / guias indesejados inseridos pelo processo de comparação.

$ diff -y 1.txt 2.txt | sed 's/\s*|\t*//g'
1.a
2.b
3.c

Dados os arquivos 1.txt :

1.
2.
3.

e 2.txt :

a
b
c

O texto acima assume que você tem arquivos com o mesmo número de linhas e que cada linha é diferente, o que parece ser o caso da sua pergunta.

    
por 15.05.2018 / 12:29
1

Use o editor Vim, por exemplo,

  1. Abra dois arquivos lado a lado: vim FileA.txt FileB.txt -O .
  2. No primeiro arquivo, selecione verticalmente 2 colunas pressionando essas teclas:

    1. 1 , Deslocamento - G (vai para o começo do arquivo).
    2. Controlar - V (entrar no modo de bloco visual).
    3. Shift - G , $ (selecione duas colunas).
    4. y (copiar / copiar para o buffer).
  3. Vá para o próximo arquivo pressionando: Controle - w , w .
  4. Verifique se você está na primeira linha: 1 , Deslocamento - G .
  5. Na primeira linha, pressione: Shift - P para colar na vertical.
  6. Salve e saia (: wq ).

Veja a demonstração:

Paraautomatizarasetapasacimaparaarquivosmaiores,graveumamacroeinvoque-anovamenteouuseocomandoex(partedoVim)paraeditarosarquivosdeformanãointerativa;porexemplo,consulte:Como editar arquivos de forma não interativa (por exemplo, em pipeline)?

O Go pode obter resultados semelhantes em Texto sublime , usando o plug-in Vintage (Vim) ou selecionando a coluna com Alt verticalmente, copie e cole em outro arquivo.

    
por 15.05.2018 / 17:52
1

Uma solução geral do Linux é: -

E1=""; E2=""
{   while true
    do   read -r <&3 && l1="$REPLY" || l1="" E1=e
         read -r <&4 && l2="$REPLY" || l2="" E2=e
         [ "$E1$E2" == ee ] && break
         echo "$l1$l2"
    done
} 3<"$1" 4<"$2"

Formatei isso como um script de legibilidade, mas ele pode ser inserido como uma linha de comando longa substituindo as novas linhas por ponto-e-vírgula e substituindo $1 e $2 pelos caminhos dos arquivos para ser fundido.

Isso funciona da seguinte maneira: -

  • E1 e E2 são sinalizadores de fim de arquivo;
  • Dois fluxos de entrada (3 e 4) são abertos a partir dos dois caminhos de arquivos transmitidos;
  • Uma linha é lida de cada arquivo e definida nas variáveis l1 e l2 respectivamente;
  • Observe que read -r l1 remove espaços em branco iniciais e finais, portanto, o código mais complexo para definir l1 (e l2 );
  • O loop termina quando ambos os arquivos alcançam o EOF, embora seja uma modificação trivial terminar em um dos arquivos que atinge o EOF;
  • O echo será padronizado ou >"$3" poderá ser adicionado à linha, tornando o arquivo de saída o terceiro parâmetro;
  • O comando echo pode ser estendido se você quiser adicionar uma string delimitadora para separar o texto de cada arquivo.

O script acima deve funcionar no WSL (Windows Subsystem para Linux) no Windows 10 ou no CygWin em versões anteriores do Windows.

Seria possível implementar em cmd , mas eu não gostaria de tentar, embora seja simples no freeware de substituição cmd aprimorado TCC / LE . Também deve ser possível com o PowerShell, mas não tenho muita experiência nisso, já que uso principalmente o Linux.

    
por 15.05.2018 / 17:26
1

Use o editor CudaText com o recurso de seleção múltipla.

  • Selecionar tudo no arquivo 1
  • Chame "Seleção de seleção / divisão em linhas" no arquivo 1
  • Selecionar tudo no arquivo 2
  • Chame "Seleção de seleção / divisão em linhas" no arquivo 2
  • Copiar para a área de transferência (várias linhas) no arquivo 2
  • No arquivo 1, pressione End para colocar o carets na extremidade da linha
  • !! Certifique-se de contagem de carets no arquivo-1 é igual a contagem de linhas copiadas para a área de transferência (se caret desnecessário no final - Ctrl + clique para excluí-lo)
  • Se eles forem iguais, em extremidades de linha, pressione Ctrl + V (Colar) - isso cola linha de transferência por linha
por 16.05.2018 / 12:45
0

É possível seguir as etapas para conseguir isso:

  1. Copiar o conteúdo do arquivo FileA.txt na coluna A da planilha do Excel
  2. Copiar o conteúdo do arquivo FileB.txt na coluna B da planilha do Excel
  3. Salve o arquivo do Excel como .txt file
  4. Abra o arquivo .txt em Notepad++
  5. Substitua o caractere TAB por '.'

    
por 16.05.2018 / 10:46