Aqui está uma maneira:
$ awk -F, 'NR==FNR{a[]++; next}!a[]' csv2 csv1
110,12,31,345
1,12,14,55
12,53,22,10
1,12,32,44
Explicação
-
-F,
: define o separador de campos para,. Agora, o primeiro campo separado por vírgula de cada linha será, o segundo
e assim por diante.
-
NR==FNR
: estas são duas variáveis especiais do awk. NR é a linha de entrada atual e FNR é o número da linha do arquivo atual. Os dois serão iguais apenas enquanto o primeiro arquivo estiver sendo lido. -
NR==FNR{a[]++; next}
: durante a leitura do primeiro arquivo, salve os primeiros 4 campos como uma chave na matriza
e defina seu valor como 1. Isso basicamente salva todos os 4 primeiros campos decsv1
. Onext
garante que pulemos imediatamente para a próxima linha e não processemos o restante do script. -
!a[]
: a ação padrão do awk é imprimir a linha atual. Então, se você usar algo que seja verdadeiro, o awk entende que deve imprimir essa linha.!a[ ]
é verdadeiro quandoa[]
não define o que acontecerá para as linhas emcsv1
cujos primeiros 4 campos não estavam presentes em nenhuma linha decsv2
. Portanto, esta diretiva fará com que todas as linhas cujos primeiros 4 campos nunca tenham sido vistos (para que seu valor na matriza
não seja 1) sejam impressas.