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
。对于记录2a[Karen Evich]=1
,对于记录3a[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