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
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
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 TAB
OFS="\t"
de wahr sein wird unser erwartetes Ergebnis zu erhalten.
Wenn die Datei dann sortiert wird versuchen, diese awk
$ 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
@ Rbk528 arbeiten: try:
awk '{printf("%s %s\n",!a[$1]++?$1:" ",$2)}' Input_file
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]}++;'
alle Versuche? .. – klashxx
Der Versuch, vorherige Zeile und aktuelle Zeile durch das Feld zu vergleichen, aber nicht in der Lage, in awk zu bekommen – Rbk528