Comparar colunas de dois CSVs e mesclar em correspondências

1

Eu tenho dois arquivos CSV e estou tentando mesclá-los com base na primeira coluna do primeiro arquivo correspondente à terceira coluna do segundo arquivo. Essas linhas não são classificadas.

file1.csv:

android,1,2
osx,2,5

file2.csv:

Converting,:Developer::|[E],android,Exact,,,,8,31
Converting,:Developer::|[E],osx,Exact,,,,8,31
Converting,:Developer::|[E],windows,Exact,,,,8,31

e desejaria o seguinte output.csv:

Converting,:Developer::|[E],android,Exact,,,,8,31,1,2
Converting,:Developer::|[E],osx,Exact,,,,8,31,2,5
Converting,:Developer::|[E],windows,Exact,,,,8,31,,

Eu tentei todos os exemplos de

awk -F',' 'FNR==NR.....

que eu poderia encontrar aqui, mas não consigo entender direito.

    
por BLL27 02.02.2016 / 11:54

2 respostas

3

Você pode usar join para isso

join -1 1 -2 3 -t ',' -a 2 -o 2.{1..9} 1.{2..3}  <(sort file1.csv) <(sort file2.csv)

-1 e -2 especificam qual campo dos arquivos comparar% -t especifica o separador a ser usado para os campos
-a 2 diz para imprimir linhas em <file2> que não correspondem % -o configura a saída com base em <file>.<field>

    
por 02.02.2016 / 12:22
2

A melhor ferramenta para o trabalho é provavelmente join mas como você mencionou awk , aqui está outra abordagem:

$ awk -F',' -vOFS="," 'FNR==NR{a[$1]=$2;b[$1]=$3; next}{print $0,a[$3],b[$3]}' file1 file2
Converting,:Developer::|[E],android,Exact,,,,8,31,1,2
Converting,:Developer::|[E],osx,Exact,,,,8,31,2,5
Converting,:Developer::|[E],windows,Exact,,,,8,31,,

Ele usa dois arrays, a e b , que têm o primeiro campo de file1 como chaves e o segundo e o terceiro como valores, respectivamente. O FNR==NR{...next} garante que apenas o primeiro arquivo seja salvo nas matrizes. Então, ao processar o segundo arquivo, imprimimos a linha do arquivo ( $0 ), seguida pelos valores correspondentes ao primeiro campo dos arrays a e b . O -vOFS="," define o separador do campo de saída como uma vírgula, de modo que obtemos o formato de saída desejado.

Alternativamente, um pouco mais enigmaticamente:

$ awk -F',' -vOFS="," 'FNR==NR{a[$1]=$2","$3;next}{print $0,(a[$3]?a[$3]:",")}' file1 file2
Converting,:Developer::|[E],android,Exact,,,,8,31,1,2
Converting,:Developer::|[E],osx,Exact,,,,8,31,2,5
Converting,:Developer::|[E],windows,Exact,,,,8,31,,
    
por 02.02.2016 / 12:22