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.
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?
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 . 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
Tags command-line bash scripts