Como posso copiar e colar linhas de texto em diferentes arquivos em um script bash?

3

De um determinado número de arquivos, eu preciso criar um novo arquivo onde cada linha de texto é a seqüência das respectivas linhas dos meus arquivos originais. Então, digamos que eu tenha dois arquivos com uma estrutura como esta:

Arquivo1:

AAAA
BBBB
CCCC

Arquivo2:

XXXX
YYYY
ZZZZ

Eu preciso combiná-los para obter um resultado como:

AAAAXXXX
BBBBYYYY
CCCCZZZZ

Como posso fazer isso a partir de um script bash?

    
por Someguy 23.10.2016 / 18:59

3 respostas

9

Use o comando paste :

paste -d '' File1 File2

Por padrão, paste une as linhas às guias, portanto, precisamos usar a opção -d para dizer a ela para usar a string vazia para ingressar.

    
por muru 23.10.2016 / 19:07
2

Através do método awk :

awk '{getline x<"file2"; print $0x}' file1
  • getline x<"file2" lê a linha inteira de arquivo2 e mantém a variável x .
  • print $0x imprime a linha inteira de arquivo1 usando $0 , em seguida, x , que é a linha salva de arquivo2 .
por devWeek 23.10.2016 / 19:35
1

paste é o caminho a percorrer, mas por uma questão de perfeição, aqui está uma solução focada em bash (com pouca ajuda de seq e wc ):

for _ in $(seq 1 $(wc -l <f1.txt)); do \
            read -u 3 one; read -u 4 two; echo "${one}${two}"; done 3<f1.txt 4<f2.txt

Aqui estamos enviando o conteúdo dos arquivos f1.txt e f2.txt através dos descritores de arquivos 3 e 4. read dos respectivos FDs, e echo imprime a saída no formato desejado.

A iteração irá parar após o f1.txt terminar, aqui _ é uma variável descartável.

Melhor, apenas bash , dependendo do status de saída de read quando o EOF é alcançado, com uma construção while (graças a steeldriver ):

while IFS= read -ru3 one && IFS= read -ru4 two; do echo "${one}${two}"; done 3<f1.txt 4<f2.txt

Exemplo:

$ cat f1.txt
AAAA
BBBB
CCCC

$ cat f2.txt
XXXX
YYYY
ZZZZ

$ for _ in $(seq 1 $(wc -l <f1.txt)); do read -u 3 one; read -u 4 two; echo "${one}${two}"; done 3<f1.txt 4<f2.txt
AAAAXXXX
BBBBYYYY
CCCCZZZZ

$ while IFS= read -ru3 one && IFS= read -ru4 two; do echo "${one}${two}"; done 3<f1.txt 4<f2.txt
AAAAXXXX
BBBBYYYY
CCCCZZZZ
    
por heemayl 23.10.2016 / 21:25