Script para classificar o conteúdo de vários arquivos em um diretório

3

Bom dia, eu tenho que coletar o histórico de navegação de certas pessoas todos os meses, e eu sou um noob total do Linux. Gostaria de, em primeiro lugar, sort dos sites executar um uniq -u . A saída do programa que eu uso se parece com isso -

==================================================
URL               : http://example.com/
==================================================
==================================================
URL               : http://example.com/en
==================================================
==================================================

Há cerca de 30 deles em uma pasta /history nomeada por exemplo bob.txt , tim.txt etc. É possível fazer um script que classifica o conteúdo em todos os arquivos no diretório, remove todo o conteúdo = assina, remove duplicados e salva o resultado em um novo arquivo, por exemplo bob.doc , tim.doc ?

No momento, estou executando manualmente sort bob.txt | uniq -u > bob.doc

    
por Bollie 06.11.2017 / 10:48

2 respostas

7

Isso funciona, pelo menos para o exemplo que você deu:

for i in *.txt; do
  sed '/=/d;s/URL *: //' "$i" |
  sort -u > "${i%%.txt}".doc
done

Explicações

  • for i in *.txt; do … done - percorre todos os arquivos .txt no diretório atual
  • sed '/=/d;s/URL *: //' - remova todas as linhas que começam com = , exclua as coisas antes do URL em todas as linhas
  • sort -u - classifica e gera apenas o primeiro de uma execução igual
  • > "${i%%.txt}".doc - saída de redirecionamento para, e. bob.doc para um arquivo de entrada bob.txt (usando Expansão de parâmetro )
por dessert 06.11.2017 / 10:53
3

GNU awk (padrão no Ubuntu) - sozinho:

awk -vFPAT='https?:[^\s]+' 'BEGIN {PROCINFO["sorted_in"]="@ind_str_asc"} \
            /\w+/{a[]} END{for(i in a) print i}' *.txt
  • Assumindo que todos os arquivos de entrada terminem em .txt ; se não, faça as mudanças necessárias no padrão glob *.txt

  • Variável FPAT define a definição de campo usando Regex, definimos uma porção de registros começando com http com um opcional s depois disso, seguido por : , até o próximo espaço em branco como um campo por o padrão Regex https?:[^\s]+'

  • awk suporta apenas matrizes associativas que não são classificadas por padrão (bem, classificadas de acordo com um hash interno - este é um detalhe de implementação), estamos definindo a ordem de classificação da matriz a de acordo com as strings de índice usando array associativo PROCINFO com a chave sorted_in tendo valor @ind_str_asc by PROCINFO["sorted_in"]="@ind_str_asc" . Se você quiser ordem decrescente, use PROCINFO["sorted_in"]="@ind_str_desc"

  • Finalmente, END{for(i in a) print i} itera sobre os elementos da matriz a e imprime as chaves da matriz classificada.

Se você quiser salvar a saída em um arquivo, por exemplo out.txt :

awk -vFPAT='https?:[^\s]+' 'BEGIN {PROCINFO["sorted_in"]="@ind_str_asc"} \
            /\w+/{a[]} END{for(i in a) print i}' *.txt >out.txt

EDITAR:

Se você quiser salvar a saída de cada arquivo processado em um arquivo correspondente com a extensão .txt substituída por .doc , use awk variable FILENAME para obter o nome do arquivo, sub(".txt$", ".doc", FILENAME para fazer o arquivo renomeando e ENDFILE para fazer o processamento da matriz no final do processamento de cada arquivo:

awk -vFPAT='https?:[^\s]+' 'BEGIN {PROCINFO["sorted_in"]="@ind_str_asc"} \
           /\w+/{a[]} ENDFILE{sub(".txt$", ".doc", FILENAME); \
                  for(i in a) print i > FILENAME}' *.txt
    
por heemayl 06.11.2017 / 13:02