2017-04-06 30 views
-1

我想從下面的文件中找到重複的名稱,並用「」標記它們。在重複的名稱上添加雙引號

文件:

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

輸出想要的樣子:

"James Miki": 123-456-7890 

謝謝。

+1

SO不是自由編碼服務。請發佈你已經嘗試過的。另外,非重複行會發生什麼? –

+0

你準備使用其他標準的UNIX程序,比如'sort'和'uniq'嗎?因爲在這樣的情況下他們會讓你的生活更輕鬆。 –

+0

我輸入sortabat2.txt | uniq -d,它打印出唯一的名稱,但是如何在databook2.txt中添加「」到名稱 – xmz

回答

0

試試這個 -

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 

解釋 -

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

嗨VIPIN,感謝您的幫助。我試過你的腳本,但它似乎只打印出我的測試文件中的一個結果,實際上有三個重複的名字。 – xmz

+0

@ XimengZhao - 我已經用測試用例和新代碼更新了我的答案,請檢查。 –

1

awk來救援!

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

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

嗨,這是我從上面的代碼得到的結果。我想展示的只是標籤重複的名稱和非重複的名稱仍然存在。謝謝。「Evich卡倫」:​​284-758-2867 「: 」Evich卡倫「:284-758-2867 」: 「: 「Fardbarkle弗雷德」:674-843-1385 「: 」「: 」 : 「」: 「: 」: 「: 」「: 」「: 」: 「: 」: 「尼爾傑西」:408-233-8971 「: 「」: 「」: 「: 」「: 」: 「: – xmz

+2

請不要在評論中粘貼格式化的數據,而是更新您的問題。 – karakfa

+0

@ XimengZhao除非你明確地打印'Fardbarkle Fred',否則不可能從包含'Fardbarkle Fred'的輸入中得到包含'Fardbarkle Fred'的輸出,我假定你不是。當編輯你的問題來解釋你使用這個解決方案時的問題(這對你問的問題來說確實是正確的解決方案),確保你發佈的輸出與你的輸入相匹配,並且兩者都真實地代表你的真實數據。 –

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

感謝里卡多,我試了一下你的腳本,發現文件中有兩個重複的名字,它只打印出一個帶雙引號的名字。如果條件爲真,如何修改代碼,打印所有信息。 – xmz

0

使用另一種方法sed + sort + uniq管道:

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

輸出:

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

我得到了像「詹姆斯三木:123-456-7890」,但我想要的是「詹姆斯三基」:123-456-7890,雙引號不符合名稱。 – xmz

+0

@XimengZhao,檢查你的表達錯誤。上述方法可以很好地處理您的輸入 – RomanPerekhrest