Sed 添加指示重复名称的标签

Sed 添加指示重复名称的标签,sed,text-processing,Sed,Text Processing,我试着用 sed 's/ */:/' file | awk -F: '{ if (arr[$1":"$2]) print "\""$1"\":"$2; else { arr[$1":"$2]++; print $0 }}' 但不能得到理想的输出。谢谢 下面是我想要的文件信息和所需的输出 文本文件: Jon DeLoach:408-253-3122:123 Park St., San Jose, CA 04086:7/25/53:85100 Karen Evich:284-758-2857:2

我试着用

sed 's/ */:/' file | awk -F: '{ if (arr[$1":"$2]) print "\""$1"\":"$2; else { arr[$1":"$2]++; print $0 }}' 
但不能得到理想的输出。谢谢

下面是我想要的文件信息和所需的输出

文本文件:

Jon DeLoach:408-253-3122:123 Park St., San Jose, CA 04086:7/25/53:85100
Karen Evich:284-758-2857:23 Edgecliff Place, Lincoln, NB 92086:7/25/53:85100
Karen Evich:284-758-2867:23 Edgecliff Place, Lincoln, NB 92743:11/3/35:58200
Karen Evich:284-758-2867:23 Edgecliff Place, Lincoln, NB 92743:11/3/35:58200
Fred Fardbarkle:674-843-1385:20 Parak Lane, DeLuth, MN 23850:4/12/23:780900
Fred Fardbarkle:674-843-1385:20 Parak Lane, DeLuth, MN 23850:4/12/23:780900
Lori Gortz:327-832-5728:3465 Mirlo Street, Peabody, MA 34756:10/2/65:35200
Paco Gutierrez:835-365-1284:454 Easy Street, Decatur, IL 75732:2/28/53:123500
Paco Gutierrez:835-365-1284:454 Easy Street, Decatur, IL 75732:2/28/53:123500
Jesse Neal:408-233-8971:45 Rose Terrace, San Francisco, CA 92303:2/3/36:25000
Jesse Neal:408-233-8971:45 Rose Terrace, San Francisco, CA 92303:2/3/36:25000
Zippy Pinhead:834-823-8319:2356 Bizarro Ave., Farmount, IL 84357:1/1/67:89500
所需输出:添加指示重复名称的星号

Jon DeLoach:408-253-3122:123 Park St., San Jose, CA 04086:7/25/53:85100
*Karen Evich*:284-758-2857:23 Edgecliff Place, Lincoln, NB 92086:7/25/53:85100
*Karen Evich*:284-758-2867:23 Edgecliff Place, Lincoln, NB 92743:11/3/35:58200
*Karen Evich*:284-758-2867:23 Edgecliff Place, Lincoln, NB 92743:11/3/35:58200
*Fred Fardbarkle*:674-843-1385:20 Parak Lane, DeLuth, MN 23850:4/12/23:780900
*Fred Fardbarkle*:674-843-1385:20 Parak Lane, DeLuth, MN 23850:4/12/23:780900
Lori Gortz:327-832-5728:3465 Mirlo Street, Peabody, MA 34756:10/2/65:35200
*Paco Gutierrez*:835-365-1284:454 Easy Street, Decatur, IL 75732:2/28/53:123500
*Paco Gutierrez*:835-365-1284:454 Easy Street, Decatur, IL 75732:2/28/53:123500
*Jesse Neal*:408-233-8971:45 Rose Terrace, San Francisco, CA 92303:2/3/36:25000
*Jesse Neal*:408-233-8971:45 Rose Terrace, San Francisco, CA 92303:2/3/36:25000
Zippy Pinhead:834-823-8319:2356 Bizarro Ave., Farmount, IL 84357:1/1/67:89500

试一试。看起来不错

$ awk -F":" 'NR==FNR{a[$1]++;next}(a[$1]>1){sub($1,"*" $1 "*")}1' file1 file1
说明:
此代码读取同一文件两次。这可能会导致性能下降,具体取决于文件大小

-F:“
:全局输入字段分隔符定义为

NR==FNR{a[$1]++;next}
:当awk读取第一个文件时,执行
{}
中的代码

a[$1]+
:为找到的每个$1创建一个数组
a
,其中索引
$1
,值
+
=>+1。因此,对于记录1,我们有
a[Jon DeLoach]=1
。对于记录2
a[Karen Evich]=1
,对于记录3
a[Karen Evich]++
=>
2
,等等

next
:指示awk转到下一条记录并跳过其余脚本

(a[$1]>1){sub($1,“*”$1“*”)1
:此条件和操作在第二个文件上执行。对于第二个文件中的每个
a[$1]
,其值为
>1
(第一个文件完成时已完成),我们使用awk子函数在
$1
周围插入
*
sub
函数将替换直接应用于
$0
=整个记录


1
:打印第二个文件的整个记录

继续?@RomanPerekhrest是的,我在这里发布我的原始数据只是想让问题更清楚。要让问题更清楚,修改问题,不要发布一个全新的问题。谢谢,这是正确的。你能解释一下你的脚本吗,'NR==FNR{a[$1]++;next}(a[$1]>1){sub$1,“$1”“)}1'?@XimengZhao请看更新解释,那里的工作很好,可以合并或删除重复的结果?我可以使用此命令删除重复的结果,但不能合并。啊!看过[$0]+'@XimengZhao你说的合并是什么意思?您的命令(
!seen[$0]+
)将打印所有uniq行+一行重复行。如果只想打印排除所有重复项的uniq行,可以尝试
awk-F:“'NR==FNR{a[$1]+;next}a[$1]==1'file1 file1