Comparando dois arquivos e imprimindo linha vazia para inigualável?

0

Eu estou tentando combinar dois arquivos e imprimir o resultado da partida e deixar a linha vazia para resultado sem correspondência, com base na coluna Número 3. A idéia aqui é fazer com que os dois arquivos tenham a mesma duração.

exemplo: arquivo 1

BMW 111  N1
BENZ 123 N2
TOYOTA 122 N3 

arquivo2

N1
N23
N3 

resultado:

BMW 111 N1
*blank line (N23 does not exit in file 1*
TOYOTA 122 N3 

Eu usei o AWK para combinar os dois arquivos, mas não consigo inserir linha em branco

awk 'NR==FNR{a[$1];next}$3 in a{print $1,$2,$3}' file2.txt file1.txt > result.txt 

como em link

    
por Lona gracia 13.06.2018 / 21:29

4 respostas

1
for line in $(cat file2); 
do
   grep $line file1 || echo ""; 
done

Produz a seguinte saída

$ for line in $(cat file2); do   grep $line file1 || echo ""; done
BMW 111  N1

TOYOTA 122 N3
$
    
por 13.06.2018 / 21:41
3

Em vez de $3 in a{print $1,$2,$3} , tente !($3 in a){$0 = ""} 1 .

    
por 13.06.2018 / 21:42
2

Supondo que os dois arquivos estão classificados no campo de associação:

$ join -1 3 -a 2 -o1.1,1.3,1.3 file1 file2
BMW N1 N1

TOYOTA N3 N3

Isso faz uma operação JOIN relacional nos dois arquivos, usando a terceira coluna de file1 (com -1 3 ) e a primeira e única coluna de file2 . Pedimos que todas as linhas de file2 sejam incluídas na saída (com -a 2 ), mesmo linhas não-pareadas. Para a saída, solicitamos que todos os três campos do primeiro arquivo sejam impressos (com o -o flag). Campos vazios em linhas não combinadas permanecerão vazios, mas pode-se adicionar -e something para preenchê-los com a string something .

Se os dois arquivos não forem ordenados no campo de junção, você poderá classificá-los previamente usando

sort -k3 -o file1 file1
sort -o file2 file2

ou, você pode fazer a ordenação ao mesmo tempo que a junção, se seu shell suportar substituições de processo, com

join -1 3 -a 2 -o1.1,1.3,1.3 \
    <( sort -k3 file1 ) \
    <( sort file2 )
    
por 13.06.2018 / 21:54
1
  paste file1.txt file2.txt | sed -Ee 's/\s(\S+)\s+\s*$/ /;t'  -e g

Isto imprime o conteúdo dos arquivos lado a lado por linha e então deixamos o Gnu sed operar nesta linha.

Caso os últimos campos de arquivos coincidam, apagamos a linha e a imprimimos. Caso contrário, imprimimos uma linha vazia, recuperada do espaço vazio.

Outra maneira poderia ser:

paste a.txt b.txt | awk '{NF -= $(NF) == $(NF-1) ? 1 : NF}1'
    
por 14.06.2018 / 04:32