Como executar um script para obter certos conteúdos de um arquivo

0

Digamos que um arquivo tenha os dados de login para vários usuários:

bobby activityname 2014-05-12([email protected])
bill activityname 2014-06-12([email protected])
bobby activityname 2014-06-12([email protected])

Como posso criar um script para criar um arquivo de cew que mostre o nome da pessoa e as diferentes datas em que ele se conectou?

bill
2014-06-12
bobby
2014-05-12 
2014-06-12
    
por Young le 07.02.2015 / 22:00

2 respostas

4

$ awk -F'[ (]' '{a[$1]=a[$1] $3 "\n"} END{for (name in a)print name "\n" a[name]}' loginFile
bobby
2014-05-12
2014-06-12

bill
2014-06-12

Como funciona

  • -F'[ (]'

    Isso diz a awk para aceitar um espaço ou um parens aberto como o separador de campo.

  • a[$1]=a[$1] $3 "\n"

    Isso armazena as datas de login para cada usuário em uma matriz a .

  • END{for (name in a)print name "\n" a[name]}

    Quando terminamos de ler o arquivo, isso imprime os dados coletados.

Salvando a saída em um arquivo

Para salvar a saída em um arquivo, pode-se usar o redirecionamento shell . Assim:

awk -F'[ (]' '{a[$1]=a[$1] $3 "\n"} END{for (name in a)print name "\n" a[name]}' loginFile >newFile

Como lidar com uma data e uma vez

Suponha que o arquivo de entrada se pareça com:

$ cat loginFile2 
bobby activityname 2014-05-12 15:20([email protected]) 

Para obter a data e a hora, execute:

$ awk -F'[ (]' '{a[$1]=a[$1] $3 " " $4 "\n"} END{for (name in a)print name "\n" a[name]}' loginFile2
bobby
2014-05-12 15:20

Lidando com vários espaços

Os exemplos acima todos tinham espaços únicos. Se houver um ou mais espaços entre os itens, então, para arquivos com data e hora, use:

awk -F' *[ (]' '{a[$1]=a[$1] $3 " " $4 "\n"} END{for (name in a)print name "\n" a[name]}' loginFile
    
por 07.02.2015 / 22:27
0

Aqui está o do python.

import sys
import re
from collections import defaultdict
file = sys.argv[1]
f = open(file, 'r')
m = re.findall(r'(?m)^(\S+).*?\b(\d{4}-\d{2}-\d{2})(?=\()', f.read())
d = defaultdict(list)
for k, v in m:
    d[k].append(v)
result = dict(d.items())
for i in result:
    print(i)
    print('\n'.join([x for x in result[i]]))
    print('\n', end = "")

Salve o script acima em um arquivo, diga script.py e execute o script no arquivo de entrada, acionando o comando abaixo no terminal.

python3 script.py inputfile
    
por 08.02.2015 / 15:35