Converter lista de países para lista de continentes no Bash

0

Estou fazendo algumas pesquisas de geoip usando o comando geoiplookup no Linux. Isso corretamente retorna os códigos de país para mim, mas eu preciso dividi-los em continentes em vez de países. Atualmente, tenho um arquivo de texto cheio de países e estou tentando determinar a melhor maneira de convertê-los em continentes usando bash . Eu tenho um segundo arquivo de texto chamado conversão e é assim:

United States:North America
Mexico:North America
Canada:North America
Argentina:South America
Bolivia:South America
Brazil:South America 
Chile:South America
etc.

Eu estava pensando em fazer algum tipo de loop para o nome no arquivo geo.txt e grep o arquivo conversion.txt e depois imprimir qualquer coisa depois do : . Eu duvido que essa seja a maneira mais fácil / melhor, então só queria ter algumas opiniões sobre isso.

    
por Eric 27.01.2014 / 21:06

3 respostas

2

Eu faria o oposto de sua proposição:

Faça o loop no arquivo coutry: continent (conversion.txt) e use sed para fazer a alteração em uma cópia do geo.txt:

GEO_FILE="geo.txt"
CONVERSION_FILE="conversion.txt"

TARGET_FILE="continent-${GEO_FILE}"

cp "${GEO_FILE}" "${TARGET_FILE}"

while read LINE; do
  COUNTRY="$(echo "${LINE}" | cut --delimiter=':' --fields=1)"
  CONTINENT="$(echo "${LINE}" | cut --delimiter=':' --fields=2)"

  command sed -i -e "s/${COUNTRY}/${CONTINENT}/g" "${TARGET_FILE}"
done < "${CONVERSION_FILE}"

more "${TARGET_FILE}"
    
por 27.01.2014 / 21:24
2

O comando geoiplookup fornece informações na forma

GeoIP Country Edition: US, United States

Para que você possa obter as informações do país com

export IP=serverfault.com
country=$(geoiplookup "$IP" | awk 'BEGIN {FS=","} ; {print $2}' | sed 's/^ //')
echo $country
United States

Você pode então passar isso para o awk

awk -v search="$country" 'BEGIN {FS=":"} ; $0 ~ search {print $2}' conversion.txt
North America

Vou deixar isso como um exercício para você colocar uma verificação de erros e outras sutilezas em um script.

    
por 27.01.2014 / 21:50
1

Uma coisa que você não quer fazer é chamar sed / grep / awk para cada iteração de um loop:

awk -F: 'NR==FNR {c[$1]=$2;next} {print c[$0]}' conversion.txt geo.txt > continents.txt
    
por 27.01.2014 / 22:31

Tags