introduz quebra de linha na mesma posição com base em outro arquivo

4

Eu tenho 3 arquivos de entrada, todos com o mesmo número de linhas. Eu criei um exemplo de filme para fazer a pergunta parecer interessante.

file1.txt - contém essencialmente os nomes dos atores.

1234|jacknicholson|actor
5678|jacknicholson|director
4321|christianbale|actor

file2.txt - Contém os filmes dos atores.

1234|oneflewovercuckoosnest^asgoodasitgets
5678|theshining
4321|batmanbegins^darkknight

file3.txt - Residência dos atores.

1234|california
5678|hollywoodstudios
4321|losangeles

Estou dividindo o primeiro arquivo de entrada com base na condição de que, se os nomes forem iguais, preciso aplicar algum algoritmo. O comando é como abaixo.

awk -F '|' 'NR>1 && $2 != prev {print ""} {prev=$2; print}' file1.txt

O comando acima fará meu primeiro arquivo ( file1.txt ) como,

1234|jacknicholson|actor
5678|jacknicholson|director

4321|christianbale|actor

Eu preciso apresentar o espaço na mesma posição nos dois arquivos restantes também, para que eu possa aplicar o meu algoritmo.

Uma abordagem que me vem à mente é armazenar a posição dos espaços no file1.txt em uma matriz e, quando encontrar essa posição nos dois arquivos restantes, introduzir os espaços.

    
por Ramesh 01.04.2014 / 02:22

2 respostas

4

Para introduzir uma linha em branco em um arquivo na mesma posição das alterações nos atores em file1.txt , tente:

$ awk -F '|' '{save=$0; getline<"file1.txt"} NR>1 && $2!=prev {print ""} {prev=$2; print save}' file2.txt
1234|oneflewovercuckoosnest^asgoodasitgets
5678|theshining

4321|batmanbegins^darkknight

O exemplo acima funciona um pouco como o seu código, exceto que ele é estendido para ler dois arquivos ao mesmo tempo. Ele lê a partir de file2.txt e salva a linha na variável save . Se, então, for lida de file.txt e usando a mesma lógica do seu código, determina se o agente muda e, em caso afirmativo, imprime uma quebra de linha. Em seguida, imprime a linha recebida de file2.txt .

    
por 01.04.2014 / 03:18
1

Outra solução awk :

$ awk 'FNR==NR{if(!NF){a[FNR]=1}next}a[FNR]{print"\n"$0;next}{print}' file1.txt file2.txt
1234|oneflewovercuckoosnest^asgoodasitgets
5678|theshining

4321|batmanbegins^darkknight
  • Ao ler file1.txt , marcamos o número da linha na matriz a se a linha está em branco.
  • Ao ler file2.txt , obtemos o número da linha que está em branco na matriz a e imprima uma linha em branco antes dela. Para outras linhas, nós imprimimos normalmente.
por 01.04.2014 / 04:42

Tags