Como quebrar uma string - Bash

Como quebrar uma string - Bash

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, nome de usuário (atra522) etc. Como devo abordar esse problema?

cop1010 ADD atra522,Allison Track,CT,canada

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

Responder1

Você disse bash, então vamos fazer tudo com os recursos internos do shell:

$ 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 definir todos eles como variáveis ​​(em vez de repeti-los) e nunca precisar gerar um subshell para executar awk, cutou qualquer outra ferramenta.

Responder2

Você pode usar a função do awk splitpara dividir ainda mais o primeiro campo em um array, 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];
    }
  }'

Responder3

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 baseado 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
- - -

informação relacionada