So trennen Sie eine Zeichenfolge - Bash

So trennen Sie eine Zeichenfolge - Bash

Ich habe eine Liste mit Zeichenfolgen im folgenden Format. Welche Befehle könnte ich verwenden, um die jeweiligen Abschnitte zu extrahieren? Ich dachte daran, grep zu verwenden, um die Schlüsselwörter zu extrahieren, z. B.: ADD, Benutzername (atra522) usw. Wie gehe ich dieses Problem an?

cop1010 ADD atra522,Allison Track,CT,canada

Ich weiß, wie ich mit Cut oder Awk alle Felder durch Suchen nach Kommas erhalte, aber ich weiß nicht, wie es mit dem ersten Feld „cop1010 ADD atra522“ funktioniert.

Antwort1

Sie haben gesagt bash, also machen wir alles mit integrierten Shell-Funktionen:

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

Sie können sie alle als Variablen festlegen (anstatt sie wiederzugeben) und müssen nie eine Subshell starten awk, um cut, oder ein anderes Tool auszuführen.

Antwort2

Sie können die Funktion von awk verwenden split, um das erste Feld weiter in ein Array aufzuteilen, z. B.

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

Antwort3

Python-Lösung:

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 = []

Getestet mit benutzerdefinierter Datei basierend auf dem Beispiel des 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

Aus Gründen der Python-3-Kompatibilität und der übersichtlichen Datenausgabe könnten wir Folgendes tun:

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

verwandte Informationen