
Gostaria de unir dados de dois arquivos CSV com base nas informações das colunas correspondentes. Os dados a serem correspondidos são da coluna 5 do Arquivo1.csv e da coluna 1 do Arquivo2, e desejo anexar as informações da coluna 2 do Arquivo2 na correspondência e, se não houver correspondência, deixe aspas duplas vazias.
Arquivo1.csv
"Z","P","W","K","1","1.18.24.59"
"S","K","D","X","9","1.14.19.238"
"R","M","P","Y","8","1.15.11.21"
"B","D","0","U","5","1.9.20.159"
"R","E","W","Q","6","135.0.0.1"
"K","D","K","R","9","1.9.74.13"
Arquivo2.csv
"65.9.7.19","374 22 53"
"1.9.74.13","123 256 51"
"1.18.24.59","23 25 41"
"1.15.11.21","98 77 8291"
"1.14.19.238","8827 145 8291"
"1.9.20.159","283 1 5734"
Saída Desejada
"Z","P","W","K","1","1.18.24.59","23 25 41"
"S","K","D","X","9","1.14.19.238","8827 145 8291"
"R","M","P","Y","8","1.15.11.21","98 77 8291"
"B","D","0","U","5","1.9.20.159","283 1 5734"
"R","E","W","Q","6","135.0.0.1",""
"K","D","K","R","9","1.9.74.13","123 256 51"
Responder1
Aqui está uma solução, usando awk
. Testado em GNU awk 4.1.3.
$ awk -F, 'NR==FNR{a[$1]=$2}NR!=FNR{print $0","(a[$6]?a[$6]:"\"\"")}' file2.csv file1.csv
"Z","P","W","K","1","1.18.24.59","23 25 41"
"S","K","D","X","9","1.14.19.238","8827 145 8291"
"R","M","P","Y","8","1.15.11.21","98 77 8291"
"B","D","0","U","5","1.9.20.159","283 1 5734"
"R","E","W","Q","6","135.0.0.1",""
"K","D","K","R","9","1.9.74.13","123 256 51"
$
- Corresponde
NR==FNR{a[$1]=$2
às linhas no arquivo2 e as adiciona em uma matriz, digitada no campo nº 1. - O
NR!=FNR
então corresponde às linhas no arquivo1. print $0","
imprime a linha inteira do arquivo1 seguida por uma vírgula.(a[$6]?a[$6]:"\"\"")
imprime o conteúdo correspondente do array criado anteriormente, mas apenas""
se nenhuma entrada for encontrada.
Responder2
Isso acabou sendo mais difícil do que eu esperava, mas com as ferramentas da csvkit
versão 1.0.2 baseada em python:
$ csvjoin -HI -c 6,1 --left File1.csv File2.csv 2>/dev/null | csvformat -K1 -U1
"Z","P","W","K","1","1.18.24.59","23 25 41"
"S","K","D","X","9","1.14.19.238","8827 145 8291"
"R","M","P","Y","8","1.15.11.21","98 77 8291"
"B","D","0","U","5","1.9.20.159","283 1 5734"
"R","E","W","Q","6","135.0.0.1",""
"K","D","K","R","9","1.9.74.13","123 256 51"
(Isso -I
parece ser necessário para evitar csvjoin
adivinhar que os campos separados por pontos são datas e horas, pelo menos na minha localidade.)
Responder3
for i in `cat file2.csv | awk -F "," '{print $1}'| sed 's/"//g'`; do j=`sed -n '/'$i'/p' file2.csv| awk -F "," '{print $2}'| sed 's/"//g'`;awk -v i="$i" -v j="$j" -F "," '$NF==i{$7=j;print $0}' file1.csv; done| sed 's/ /","/g'| sed 's/^/"/g'| sed 's/$/"/g'
saída
"Z","P","W","K","1","1.18.24.59","23 25 41"
"S","K","D","X","9","1.14.19.238","8827 145 8291"
"R","M","P","Y","8","1.15.11.21","98 77 8291"
"B","D","0","U","5","1.9.20.159","283 1 5734"
"R","E","W","Q","6","135.0.0.1",""
"K","D","K","R","9","1.9.74.13","123 256 51"