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
$
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
Em vez de $3 in a{print $1,$2,$3}
, tente !($3 in a){$0 = ""} 1
.
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 )
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'
Tags text-processing awk