2017-04-06 12 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

'sort'や' uniq'のような他の標準的なUNIXプログラムを使用していますか?彼らはこのような状況であなたの人生を楽にしてくれるからです。 –

+0

私はsortedを入力しましたdatabook2.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、ありがとう。私はあなたのスクリプトを試しましたが、実際には私のテストファイルから1つの結果しかプリントアウトしないようですが、実際にそこに3つの重複した名前があります。 – xmz

+0

@ XimengZhao - テストケースと新しいコードでMy Answerを更新しました。確認してください。 –

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'を含む出力を得ることはできません。このソリューションで問題を説明するために質問を編集するとき(あなたが尋ねた質問にちょうどいい解決策です)、あなたが投稿した出力があなたの入力と一致していて、本当のデータを本当に表していることを確認してください。 –

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

Ricardoさん、ありがとうございました。あなたのスクリプトを試してみましたが、ファイルに2つの重複した名前がある場合は、二重引用符で囲んだものだけが表示されていました。 if条件が真のときにコードを修正する方法は、すべての情報を表示します。 – xmz

0

sed + sort + uniqパイプラインを使用して別の方法:

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

出力:

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

「James Miki:123-456-7890」のようなものがありますが、「James Miki」が必要です:123-456-7890、二重引用符は名前ではありません。 – xmz

+0

@ XimengZhao、式のエラーを確認してください。上記のアプローチはあなたの入力にうまくいきます – RomanPerekhrest

関連する問題