2017-05-08 3 views
1

Der Eingabetext in Test.txt-Datei verwenden:Wie mehrere Muster mit der Bedingung

{"col1":"250000","col2":"8089389","col4":"09876545","col3":"121","col5":"123456789"} 
{"col1":"210000","col3":"112","col2":"8089389","col4":"09876545","col5":"123456789"} 
{"col1":"120000","col2":"8089389","col3":"123","col4":"09876545","col5":"123456789"} 
{"col1":"170000","col2":"8089389","col4":"09876545","col5":"123456789","col3":"123"} 
{"col1":"190000","col2":"8089389","col4":"09876545","col5":"123456789,"col3":"124""} 
{"col3":"176","col1":"220000","col2":"8089389","col4":"09876545","col5":"123456789"} 

Die Befehlszeilen und führt, dass ich versuche:

$ awk -F"," '{for(i=1;i<=NF;i++){ if($i ~ /col1/){print $i} };for (x=1;x<=NF;x++){if($x ~ /col3/){print $x}}}' test.txt 
{"col1":"250000" 
"col3":"121" 
{"col1":"210000" 
"col3":"112" 
{"col1":"120000" 
"col3":"123" 
{"col1":"170000" 
"col3":"123" 
{"col1":"190000" 
"col3":"124" 
{"col1":"220000" 
"col3":"176" 

Das erwartete Ergebnis, das ich mag zu erhalten:

col1:250000,col3:121 
col1:210000,col3:112 
col1:120000,col3:123 
col1:170000,col3:123 
col1:190000,col3:124 
col1:220000,col3:176 

Antwort

2

Scheint, wie Sie eine json Datei parsen. Sie können jq,

$ jq --raw-output '"col1:" + .col1 + ",col3:" + .col3' file.json 
col1:250000,col3:121 
col1:210000,col3:112 
col1:120000,col3:123 
col1:170000,col3:123 
col1:190000,col3:124 
col1:220000,col3:176 

Für weitere Informationen verwenden: jq manual

+0

Leider gibt es nicht jq auf meinem Server und ich habe nicht die Erlaubnis, es zu installieren. Irgendeine Idee mit awk? –

+0

@RafaelNguyen, keine Notwendigkeit, es zu installieren. Sie können vorkompilierte Binärdatei [hier] (https://stedolan.github.io/jq/) erhalten – sat

1

Versuch:

awk '{gsub(/\{|\"|\}|\;/,"");match($0,/col1[^,]*/);VAL1=substr($0,RSTART,RLENGTH)",";match($0,/col3[^,]*/);VAL2=substr($0,RSTART,RLENGTH);if(VAL1 && VAL2){print VAL1 VAL2}}' Input_file 

ich global die Zeichen an Substitution {} "; in der Linie und dann nach einem Spiel suchen col1 und col3 strings in jeder Zeile und wenn sowohl die col1- als auch die col3-Strings vorhanden sind und dann gedruckt werden

E DIT: Hinzufügen einer nicht-Liner Form der Lösung auch jetzt.

awk '{ 
     gsub(/\{|\"|\}|\;/,""); 
     match($0,/col1[^,]*/); 
     VAL1=substr($0,RSTART,RLENGTH)","; 
     match($0,/col3[^,]*/); 
     VAL2=substr($0,RSTART,RLENGTH); 
     if(VAL1 && VAL2){ 
           print VAL1 VAL2 
         } 
     } 
    ' Input_file 
1

wenn fehlende json Werkzeuge, hier ist ein awk Hack

$ awk -F'[:,]' -v OFS=, -v cols='col1,col3' ' 
     {n=split(cols,c); 
     gsub(/[{}"]/,""); 
     for(i=1;i<NF;i+=2) a[$i]=$(i+1); 
     for(i=1;i<=n;i++) printf "%s%s", (c[i]":"a[c[i]]), (i==n?ORS:OFS)}' file 

col1:250000,col3:121 
col1:210000,col3:112 
col1:120000,col3:123 
col1:170000,col3:123 
col1:190000,col3:124 
col1:220000,col3:176 
0

Jedes Mal, wenn Sie Daten zu manipulieren, die Namen- hat> Werte-Mappings, dann ist es am besten, zuerst ein assoziatives Array zu erstellen, dass die Zuordnung zu speichern, (n2v[] unten) und dann können Sie einfach die gewünschten Werte drucken, indem Sie sie im Array nach ihrem Namen suchen.

$ cat tst.awk 
BEGIN { RS="}"; FS="\""; OFS="," } 
{ 
    for (i=2; i<=NF; i+=4) { 
     n2v[$i] = $(i+2) 
    } 
    print p("col1"), p("col3") 
} 
function p(n) { return (n ":" n2v[n]) } 

$ awk -f tst.awk file 
col1:250000,col3:121 
col1:210000,col3:112 
col1:120000,col3:123 
col1:170000,col3:123 
col1:190000,col3:123 
col1:220000,col3:176 
col1:220000,col3:176 
Verwandte Themen