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.
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?
Tente com sed
sed -n 's|\(.*\S\)\s\+[0-9].*|//s/$/turkish/|p' a.txt |
sed -f - b.txt
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,,
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,,