Criando um arquivo de texto a partir de outros arquivos de texto

1

Eu tenho um arquivo de texto como este

word_1 root_of_word_A
word_2 root_of_word_B
word_3 root_of_word_C
word_4 root_of_word_A

E outro documento como este

root_of_word_A root_of_word_1
root_of_word_B root_of_word_2
root_of_word_C root_of_word_3

Eu tenho que substituir no primeiro documento as outras palavras do segundo documento, assim

word_1 root_of_word_1
word_2 root_of_word_2
word_3 root_of_word_3
word_4 root_of_word_1

Eu pensei que poderia fazer algo assim com o awk. Eu tentei isso:

awk 'NR==FNR {print $1}{c[$2]++;next};c[$1]>0{print $2}' file1 file2

O problema é que eu não sei como imprimir a primeira coluna do arquivo1 e a segunda do arquivo2.

Mencione que o primeiro arquivo e o segundo têm diferentes números de linhas e que existe apenas um exemplo para deixar mais claro o que eu quero fazer (o problema não é converter A para 1, é o root_of_the_word inteiro) .

    
por cloudy_fog 15.06.2016 / 14:40

2 respostas

2

Se as palavras em file2 forem exclusivas, você poderá inverter a ordem dos arquivos, criar uma matriz em file2 e aplicá-la a file1 :

$ awk 'NR==FNR{a[$1]=$2;next}{print $1,a[$2]}' file2 file1
word_1 root_of_word_1
word_2 root_of_word_2
word_3 root_of_word_3
word_4 root_of_word_1
    
por 15.06.2016 / 15:24
1

Você está fazendo uma operação de junção relacional. Há um comando padrão do Unix para isso: join . Eu gostaria que mais pessoas soubessem sobre essa ferramenta maravilhosa!

O comando join une dois arquivos em um campo comum. No entanto, os dois arquivos precisam ser classificados nesse campo.

O campo comum é o campo 2 do primeiro arquivo ( file1.txt ) e o campo 1 do segundo arquivo ( file2.txt ). Classifique os arquivos nesses campos:

$ sort -k2,2 -o file1.txt file1.txt
$ sort -k1,1 -o file2.txt file2.txt

Em seguida, execute a união nesses campos (leia o manual para join ), especificando que queremos apenas ter o campo 1 do primeiro arquivo e o campo 2 do segundo arquivo como saídas, e classificar o resultado (se necessário) ):

$ join -1 2 -2 1 -o 1.1,2.2 file1.txt file2.txt | sort
word_1 root_of_word_1
word_2 root_of_word_2
word_3 root_of_word_3
word_4 root_of_word_1
    
por 15.06.2016 / 15:35