extrai linhas e frases de um arquivo de texto

1

Eu tenho um arquivo de texto do qual eu gostaria de extrair algumas linhas e frases. Eu também gostaria de inserir alguns caracteres em alguns pontos. É um arquivo que pretendo baixar periodicamente ao longo do dia, um com determinados valores que mudam ao longo do dia: o arquivo é uma descrição simples das condições climáticas, fornecendo dados como hora atual, temperatura, umidade e assim por diante . A maior parte do texto no arquivo não é de interesse e estou tentando encontrar uma maneira de obter apenas o texto em que estou interessado. Pego o arquivo usando o curl e gostaria de passar por algum comando. (s) que irão extrair apenas as partes necessárias e inserir os caracteres mencionados.

O conteúdo do arquivo de texto que eu pego parece muito com isso:

Smyrna, Smyrna Airport, TN, United States (KMQY) 36-00-32N 086-31-12W
Aug 09, 2016 - 10:56 AM EDT / 2016.08.09 1456 UTC
Visibility: 10 mile(s):0
Sky conditions: partly cloudy
Temperature: 86 F (30 C)
Heat index: 93.4 F (34.1 C):1
Dew Point: 73 F (23 C)
Relative Humidity: 66%
Pressure (altimeter): 30.01 in. Hg (1016 hPa)
ob: KMQY 091456Z 18006 10SM SCT035 30/23 A3001
cycle: 15

Dessas linhas, apenas 2, 4, 5 e 8 contêm texto de interesse - as outras linhas podem ser descartadas. Além disso, muito do que está nas linhas de destino também não é necessário. Deve-se observar que o conteúdo deste arquivo será um pouco fluido, com variáveis como tempo, temperatura e umidade mudando em intervalos regulares. Eu gostaria que o produto acabado, depois de eliminado o material não aproveitado, tivesse a seguinte aparência:

'Aug 09, 2016 - 10:56 AM EDT\nconditions: partly cloudy\n86 F\nHumidity: 66%'

Observe os caracteres inseridos - \ n e '(aspas no início e no final) - caracteres que precisam ser inseridos para indicar as quebras de linha e que a linha inteira, incluindo os espaços, deve ser incluída, programa para o qual eu vou estar alimentando esta saída (imagemagick). De preferência, eu gostaria de ser capaz de canalizar a saída de onda para algum comando ou série de comandos que irá extrair o material alvo, inserir as vírgulas invertidas e sequências \ n, em seguida, gravar isso em um arquivo. Então, algo como

curl http://my.weat.her/local.txt | command(s) > currentcond.txt

Alguém tem sugestões para realizar essa tarefa?

    
por MJiller 09.08.2016 / 18:03

1 resposta

2

Se a saída do comando curl for estável e consistente, poderemos criar um conjunto muito básico de comandos sed com base no número de linha

por exemplo

2s! /.*!!

pegaria a linha 2 e excluiria tudo depois do / e, assim, converteria

Aug 09, 2016 - 10:56 AM EDT / 2016.08.09 1456 UTC

em

Aug 09, 2016 - 10:56 AM EDT

Podemos adicionar \n à substituição.

Em seguida, use a opção -n para sed para torná-la apenas as linhas de impressão que têm p na substituição

Então acabamos com:

sed -n -e '2s! /.*!\n!p' \
       -e '4s/Sky \(.*\)/\n/p' \
       -e '5s/.*: \([0-9]* F\).*/\n/p' \
       -e '8s/Relative //p'

Finalmente, precisamos remover os caracteres de avanço de linha com tr -d '2' e, para simplificar, vamos colocar tudo em uma linha:

sed -n -e '2s! /.*!\n!p' -e '4s/Sky \(.*\)/\n/p' -e '5s/.*: \([0-9]* F\).*/\n/p' -e '8s/Relative //p' | tr -d '2'

Esta solução é frágil se a entrada puder variar, mas é muito fácil de entender.

Então, vamos olhar para algo um pouco menos frágil e tentar detectar as linhas baseadas no padrão.

awk '/UTC$/ { gsub(/ \/.*$/,""); d=$0 }                      
     /^Sky conditions:/ {gsub(/^Sky /,""); s=$0 }
     /^Temperature: / { t=$2 }
     /Relative Humidity: / { h=$3 }
     END { print d"\n"s"\n"t" F\nHumidity: "h }
    '

Aqui, a ordem das linhas não é tão importante, desde que elas correspondam ao padrão; as datas devem terminar em UTC, etc etc

EDIT com base na pergunta atualizada.

Colocar citações dentro de awk às vezes pode ser doloroso, então podemos trapacear e simplesmente atribuí-la a uma variável antes da mão ( q neste caso) e usá-la diretamente na declaração final print

awk -vq=\' '/UTC$/ { gsub(/ \/.*$/,""); d=$0 }                      
            /^Sky conditions:/ {gsub(/^Sky /,""); s=$0 }
            /^Temperature: / { t=$2 }
            /Relative Humidity: / { h=$3 }
            END { print q""d"\n"s"\n"t" F\nHumidity: "h""q }
           ' 
    
por 09.08.2016 / 19:31

Tags