Cómo romper una cuerda - Bash

Cómo romper una cuerda - Bash

Tengo una lista de cadenas con el siguiente formato. ¿Qué comandos podría usar para extraer las secciones respectivas? Estaba pensando en usar grep para extraer las palabras clave, es decir: ADD, nombre de usuario (atra522), etc. ¿Cómo debo abordar este problema?

cop1010 ADD atra522,Allison Track,CT,canada

Sé cómo usar cut o awk para obtener todos los campos buscando las comas, pero no sé cómo hacerlo funcionar con el primer campo "cop1010 ADD atra522".

Respuesta1

Dijiste bash, así que hagámoslo todo con las funciones integradas del 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
$ 

Puede configurarlos todos como variables (en lugar de repetirlos) y nunca necesitará generar un subshell para ejecutar awk, cutni ninguna otra herramienta.

Respuesta2

Puede utilizar splitla función de awk para dividir aún más el primer campo en una matriz, por ejemplo

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];
    }
  }'

Respuesta3

Solución de 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 = []

Probado con un archivo personalizado basado en el ejemplo de 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 compatibilidad con Python 3 y una buena impresión de datos, podríamos hacer algo como esto:

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

información relacionada