Como dividir uma string - Bash [closed]

4

Eu tenho uma lista de strings com o seguinte formato. Quais comandos eu poderia usar para extrair as respectivas seções. Eu estava pensando em usar o grep para extrair as palavras-chave ou seja: ADD, username (atra522) etc. Como devo abordar esse problema?

cop1010 ADD atra522,Allison Track,CT,canada

Eu sei usar o cut ou o awk para obter todos os campos, procurando as vírgulas, mas não sei como fazê-lo funcionar com o primeiro campo "cop1010 ADD atra522".

    
por Pazuzu 23.09.2016 / 01:18

3 respostas

9

Você disse bash , então vamos fazer tudo com os shell builtins:

$ inp="cop1010 ADD atra522,Allison Track,CT,canada"
$ IFS=, fields=($inp)
$ echo ${fields[0]}
cop1010 ADD atra522
$ echo ${fields[1]}
Allison Track
$ echo ${fields[2]}
CT
$ echo ${fields[3]}
canada
$ IFS=\  cmd=(${fields[0]})
$ echo ${cmd[0]}
cop1010
$ echo ${cmd[1]}
ADD
$ echo ${cmd[2]}
atra522
$ 

Você pode defini-las como variáveis (em vez de ecoá-las) e nunca precisar gerar uma subshell para executar awk , cut ou qualquer outra ferramenta.

    
por 23.09.2016 / 02:05
6

Você pode usar a função split do awk para dividir ainda mais o primeiro campo em uma matriz, por exemplo,

echo 'cop1010 ADD atra522,Allison Track,CT,canada' | 
  awk -F, '{
    split($1,a,"[ \t]+");
    if (a[2] == "ADD") {
      printf "Adding user: %s\n", a[3];
    }
  }'
    
por 23.09.2016 / 01:47
2

Solução Python:

import re,sys;  
for l in sys.stdin:
   if 'ADD' in l:
       data = [re.split(",",l.rstrip("\n"))[0].split()[-1]]+re.split(",",l.rstrip("\n"))[1:] 
       print " ".join(data)
       data = []

Testado com arquivo personalizado com base no exemplo do OP:

$ cat input.txt                                                                                                                       
cop1010 ADD atra522,Allison Track,CT,canada
some other stuff
testuser ADD test522,Allison TEST,CT,germany
$ python user_data.py < input.txt                                                                                                     
atra522 Allison Track CT canada
test522 Allison TEST CT germany

Para compatibilidade com python 3 e impressão bonita de dados, poderíamos fazer algo assim:

$ cat user_data.py                                                                                                                    
from __future__ import print_function
import re,sys;  
for l in sys.stdin:
   if 'ADD' in l:
       data = [re.split(",",l.rstrip("\n"))[0].split()[-1]]+re.split(",",l.rstrip("\n"))[1:] 
       print("Username: " + data[0])
       print("Real Name: " + data[1])
       print("Some kind of two char string: "+ data[2])
       print("Location: " + data[3])
       print("- - -")
       data = []

$ python user_data.py < input.txt                                                                                                     
Username: atra522
Real Name: Allison Track
Some kind of two char string: CT
Location: canada
- - -
Username: test522
Real Name: Allison TEST
Some kind of two char string: CT
Location: germany
- - -
    
por 23.09.2016 / 02:29