2017-03-09 3 views
-2

Ich habe Daten wieFormat Daten Awk Statemnt mit

name1 123 
name1 324 
name2 123 
name2 324 
name2 456 

Jetzt möchte ich O/P wie

name1 123 
     324 
name2 123 
     324 
     456 

Namen sollte nicht wiederholen

+2

alle Versuche? .. – klashxx

+0

Der Versuch, vorherige Zeile und aktuelle Zeile durch das Feld zu vergleichen, aber nicht in der Lage, in awk zu bekommen – Rbk528

Antwort

2

Quelle

name1 123 
name1 324 
name2 123 
name2 324 
name2 456 

-Code

awk '{$1= a[$1]++ ? "" : $1}1' OFS="\t" file 

Ergebnisse

name1 123 
     324 
name2 123 
     324 
     456 

Erklärung

ist die ternary Operator Let verwenden.

Wenn die unser Schlüssel $1, das erste Feld in der Matrix zu sehen ist a[$1]++ dann das erste Feld gesetzt Zeichenfolge "", auf null, wenn nicht, dann der aktuelle Wert erhalten bleibt.

Die 1 am Ende ist nur eine Verknüpfung zu vermeiden, die print-Anweisung zu verwenden.

Wenn in awk eine Bedingung erfüllt wird, wird standardmäßig die Eingabezeile gedruckt.

$ echo "test" |awk '1' 

entspricht:

echo "test"|awk '1==1' 

echo "test"|awk '{if (1==1){print}}' 

Das ist, weil 1 immer

Letzter Schritt Satz O utput F ield S eparator zu TABOFS="\t" de wahr sein wird unser erwartetes Ergebnis zu erhalten.

0

Wenn die Datei dann sortiert wird versuchen, diese

$ cat file 
name1 123 
name1 324 
name2 123 
name2 324 
name2 456 

Bei sortierten Datei

$ awk '$1!=p{print;p=$1;next}{printf("%*s %s\n",length(p)," ",$2)}' file 
name1 123 
     324 
name2 123 
     324 
     456 

Für unsortierten Datei

$ awk '{a[$1]=$1 in a ? sprintf("%s\n%*s %s",a[$1],length($1)," ",$2): $2}END{for(i in a)print i, a[i]}' file 
name1 123 
     324 
name2 123 
     324 
     456 

besser lesbare Version

awk ' 
    { 
     a[$1]=$1 in a ? sprintf("%s\n%*s %s",a[$1],length($1)," ",$2): $2 
    } 
    END{ 
     for(i in a) 
      print i, a[i] 
    } 
    ' file 

Selbst wenn Ihre Eingabedatei wie unter einem nicht sortiert ist, über ein

$ cat unsorted file 
name1 123 
name2 123 
name1 324 
name2 324 
name2 456 
0

@ Rbk528 arbeiten: try:

awk '{printf("%s %s\n",!a[$1]++?$1:"  ",$2)}' Input_file 
0

I Sie wissen, dass Sie nach awk gefragt haben, aber die meisten Orte gibt es awk gibt es auch perl:

perl -lape 's/^(\w+)/" "x length($1)/e if $seen{$F[0]}++;'