Verifique se existe um campo de um arquivo em outro arquivo e atualize a coluna específica do primeiro arquivo

1

Eu tenho 2 arquivos como abaixo:

a.txt (delimitado por tabulações e tem 3 colunas e muitas linhas):

 city   plate   region
 istanbul   36  marmara
 trabzon    61  karadeniz

b.txt (delimitado por vírgulas e tem 4 colunas e muitas linhas):

name,city,age,nationality
mehmet,trabzon,,
murat,istanbul,,
john,london,,

O que quero fazer é: verificar se a segunda coluna ( city field) de b.txt existe em a.txt (na primeira coluna - city ) e se existe em a.txt ; atualize o arquivo b.txt e defina a quarta coluna ( nationality ) para "turkish". Saída esperada:

name,city,age,nationality
mehmet,trabzon,,turkish
murat,istanbul,,turkish
john,london,,

Eu tentei seguir o comando, mas ele não gerou a saída desejada:

nawk 'BEGIN { FS = "\t" } FNR == NR {x[$1] = $1; next;} {FS=OFS=","} FNR>1{if ($2 in x) {($4 = "turkish")} } 1' a.txt b.txt
name,city,age,nationality
mehmet,trabzon,,
murat,istanbul,,
john,london,,

Você poderia ajudar a encontrar o erro no meu comando?

    
por Murat 16.10.2015 / 10:23

4 respostas

1

Seu script funciona bem. Meu palpite é que o primeiro arquivo tem espaços em vez de guias como separadores.

Remova o BEGIN { FS = "\t" } inútil para verificar se é o caso.

    
por 16.10.2015 / 10:42
0

Tente com sed

sed -n 's|\(.*\S\)\s\+[0-9].*|//s/$/turkish/|p' a.txt |
sed -f - b.txt
    
por 16.10.2015 / 10:54
0

Com awk (observe que o primeiro arquivo a.txt precisa ser carregado completamente na memória):

awk -F"[\t, ]" 'FNR==NR&&NR!=1{a[$1]="turkish"}
  FNR!=NR{OFS=",";if(FNR!=1){$NF=a[$2]};print}' a.txt b.txt
  • -F"[\t,]" define o delimitador awks para tabulação e vírgula
  • FNR==NR&&NR!=1 aplica-se apenas ao primeiro arquivo a.txt e ignora a primeira linha (cabeçalho)
    • a[$1]="turkish" definido em uma matriz chamada a do índice para o primeiro campo $1
  • FNR!=NR aplica-se apenas ao segundo arquivo b.txt
  • OFS="," define o separador do campo de saída
  • if(FNR!=1) só faz alguma coisa quando não é a linha de cabeçalho
  • $NF=a[$2] definiu o último campo para o valor salvo anteriormente turkish se ele existir na matriz
  • print e imprime a linha se o valor existir ou não

A saída:

name,city,age,nationality
mehmet,trabzon,,turkish
murat,istanbul,,turkish
john,london,,
    
por 16.10.2015 / 10:45
0
tr   -s \[:blank:] , <a.txt|    #dont mess with weird columns
cut  -d, -f1  |  sort -u   |    #drop all but unique first column entries
sed  -e's/[]*^\./$[]/\&/g'\    #handle any regex metachars properly
     -e's/.*/^[^,]*,&,/'   |    #match only second column
grep -nf - -- b.txt        |    #get line numbers at head of matched lines
sed  -e's/:.*/be/'         |    #keep only matched line numbers + 'be'
sed  -f - -eb -e:e         \    #branch away or append turkish
     -e's/$/turkish/' -- b.txt
mehmet,trabzon,,turkish
murat,istanbul,,turkish
john,london,,
    
por 16.10.2015 / 11:37