2017-04-06 4 views
-1

Ich möchte doppelten Namen aus der Datei wie unten finden und markierte sie mit "".Doppeltes Zitat auf doppelten Namen hinzufügen

Datei:

James Miki:123-456-7890 
Wang Tai: 234-563-6879 
James Miki: 123-456-7890 

Output will aussehen:

"James Miki": 123-456-7890 

Danke.

+1

SO ist kein freier Codierung Service. Bitte posten Sie, was Sie versucht haben. Was passiert mit nicht duplizierten Zeilen? –

+0

Sind Sie bereit, andere Standard-UNIX-Programme wie 'sort' und' uniq' zu verwenden? Weil sie in einer solchen Situation dein Leben erleichtern werden. –

+0

Ich tippte sort datenbuch2.txt | uniq -d, es gibt den eindeutigen Namen aus, aber wie fügt man dem Namen im Datenbuch2.txt "" hinzu – xmz

Antwort

0

Versuchen Sie, diese -

cat f 
James Miki:123-456-7890 
Wang Tai: 234-563-6879 
James Miki: 123-456-7890 
James Miki: 456-456-8888  ### added for test case 
Wang Tai: 234-563-6879  ### added for test case 
Vipin Kumar : 878-432-2345 ### added for test case 
Vipin Kumar : 878-432-2345 ### added for test case 

awk -F':' '{gsub(/ /,"",$2)}{b[$1FS$2]++} END {for(k in b) if(b[k]>1) {split(k,u,":"); print v,u[1],v FS u[2]}}' v='"' OFS="" f 
"Vipin Kumar ":878-432-2345 
"Wang Tai":234-563-6879 
"James Miki":123-456-7890 

erklärt -

gsub(/ /,"",$2): Remove space from 2nd column 
b[$1FS$2]++ : Create array b and store col1 and 2 
if(b[k]>1)  : Check duplicate record 
split(k,u,":") : split the stored value in k (combination of col1 and 2) so that we can add double quote on first column. 
+0

Hallo VIPIN, danke für Ihre Hilfe. Ich habe Ihre Skripte ausprobiert, aber es sieht so aus, als ob es nur ein Ergebnis aus meiner Testdatei ausgibt, tatsächlich gibt es dort drei doppelte Namen. – xmz

+0

@XimengZhao - Ich habe meine Antwort mit Testfällen und neuem Code aktualisiert, bitte überprüfen. –

1

awk zur Rettung!

$ awk -F: 'a[$1]++ {print "\"" $1 "\"" FS $2}' file 

"James Miki": 123-456-7890 
+0

Hallo, hier ist das Ergebnis, das ich aus dem obigen Code erhalte. Was ich zeigen möchte, ist, nur duplizierten Namen und nicht-duplizierten Namen ist immer noch da. Vielen Dank."Evich Karen": 284-758-2867 ": "Evich Karen": 284-758-2867 ": „: "Fardbarkle Fred": 674-843-1385 ": "": " : "": ": ": ": "": "": ": ": ": "Neal Jesse": 408-233-8971 „: "": "": ": "": ": „: – xmz

+2

Bitte fügen Sie keine formatierten Daten in Kommentare ein, sondern aktualisieren Sie stattdessen Ihre Frage. – karakfa

+0

@XimengZhao Es ist nicht möglich Ausgabe zu erhalten, enthaltend 'Fardbarkle Fred' vom Eingang, die nicht' Fardbarkle Fred' enthalten haben, es sei denn Sie ausdrücklich sind Druck 'Fardbarkle Fred', die ich nehme an, Sie sind es nicht. Wenn Sie Ihre Frage bearbeiten, um das Problem mit dieser Lösung zu erklären (was genau die richtige Lösung für die von Ihnen gestellte Frage ist), stellen Sie sicher, dass die von Ihnen gepostete Ausgabe Ihren Eingaben entspricht und beide wirklich repräsentativ für Ihre echten Daten sind. –

0
sed 's/: */:/' FILE | awk -F: '{ if (arr[$1":"$2]) print "\""$1"\":"$2; else { arr[$1":"$2]++; print $0 }}' 
+0

Dank Ricardo, habe ich versucht, das Skript aus und fand, wenn es zwei duplizierten Namen in der Datei sind, ist es nur ein mit doppelten Anführungszeichen ausgedruckt. Und wie Sie Ihren Code ändern, wenn Ihre if-Bedingung zutrifft, drucken Sie alle Informationen. – xmz

0

Eine weitere Alternative mit sed + sort + uniq Pipeline:

cat file | sed 's/^\(.*\) *: */"\1": /' | sort | uniq -d 

Der Ausgang:

"James Miki": 123-456-7890 
+0

Ich habe etwas wie "James Miki: 123-456-7890", aber ich will ist "James Miki": 123-456-7890, das doppelte Anführungszeichen ist nicht mit Namen. – xmz

+0

@XimengZhao, überprüfen Sie Ihren Ausdruck auf Fehler. Der obige Ansatz funktioniert gut für Ihre Eingabe – RomanPerekhrest

Verwandte Themen