Concatenação de dois campos de dois arquivos

4

Eu tenho dois arquivos: chamados t1.txt e t2.txt . O conteúdo é:

t1.txt

a
b
c

t2.txt

ab
bc
cd

Agora eu quero mesclar esses dois arquivos linha a linha em t3.txt para que o t3.txt se pareça com:

t3.txt

aab
bbc
ccd

Por favor, ajude a obter o resultado usando o script de shell.

    
por Pramod 15.08.2013 / 14:16

3 respostas

2

colar & sed

Existem maneiras mais eficientes, mas aqui está um método rápido e sujo usando paste e sed .

$ paste -d":" t1.txt t2.txt | sed 's/://g'
aab
bbc
ccd

O acima junta os dois arquivos assim:

a:ab
b:bc
c:cd

E o sed remove o : .

apenas cole

Você pode abrir mão usando o sed , é um pouco redundante dizendo ao paste para não usar nada como um delimitador ao juntar os arquivos:

$ paste -d "" t1.txt t2.txt
aab
bbc
ccd

awk

Você também pode usar awk para fazer isso:

$ awk 'NR==FNR{a[FNR]=$0;next} {print a[FNR] $0}'  t1.txt t2.txt
aab
bbc
ccd

Isso percorre o primeiro arquivo, t1.txt , e armazena-o em uma matriz, a[FNR] . O FNR é o índice nesse array com base no número da linha em que cada linha estava, no arquivo t1.txt . Posteriormente, percorre o segundo arquivo, t2.txt , e imprime a linha correspondente da linha do primeiro arquivo junto com o segundo arquivo.

junte-se a & awk & nl

Esse método é um pouco confuso, mas funciona e torna o trabalho pesado menos complicado quando se usa awk , em termos do que está acontecendo.

$ join <(nl t1.txt) <(nl t2.txt)|awk '{print $2 $3}'
aab
bbc
ccd

Os comandos nl ... produzem versões dos arquivos de teste com números de linha:

$ nl t1.txt 
     1  a
     2  b
     3  c

O comando join usa esses números de linha como a parte de dados que é comum a ambos os arquivos, para que possa se unir a ele.

$ join <(nl t1.txt) <(nl t2.txt)
1 a ab
2 b bc
3 c cd

O awk é usado no final para extrair as colunas 2 e 3 de cima.

pr & awk

O pequeno comando pr usado também pode ser usado para unir os arquivos usando sua opção de mesclagem -m .

$ pr -t -m  t1.txt t2.txt  | awk '{print $1 $2}'
aab
bbc
ccd
    
por 15.08.2013 / 14:34
1
paste -d '
paste -d '%pre%' t1.txt t2.txt > t3.txt
' t1.txt t2.txt > t3.txt

Não, não inclui caracteres NUL entre os dois arquivos.

Sim, é padrão (POSIX) e portátil, e o mais eficiente possível.

    
por 15.08.2013 / 16:03
0

Do shell BASH tente executar (sem nenhuma ferramenta adicional de processamento de texto):

exec 3< t1.txt
exec 4< t2.txt

while read l1 <&3 && read l2 <&4; do
    echo ${l1}$l2
done > t3.txt
    
por 15.08.2013 / 14:36