Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix awk检查重复和增量计数_Unix_Awk - Fatal编程技术网

Unix awk检查重复和增量计数

Unix awk检查重复和增量计数,unix,awk,Unix,Awk,要检查每个字段是否存在重复的级别,然后填充“是”,如果重复,则填充其他“否”。 然后为该字段填充出现次数的增量计数,如counter。然后检查整行是否重复或唯一 Input.csv Name,Age,Sub abc,10,eee def,20,csc abc,30,mec ghi,40,sss abc,10,eee def,10,csc 期望输出: Name,Age,Sub,Name_Dup,Name_Counter,Age_Dup,Age_Counter,Sub_Dup,Sub_Counte

要检查每个
字段是否存在重复的
级别,然后填充
“是”
,如果重复,则填充其他
“否”
。 然后为该字段填充出现次数的增量计数,如
counter
。然后检查整行是否重复或唯一

Input.csv

Name,Age,Sub
abc,10,eee
def,20,csc
abc,30,mec
ghi,40,sss
abc,10,eee
def,10,csc
期望输出:

Name,Age,Sub,Name_Dup,Name_Counter,Age_Dup,Age_Counter,Sub_Dup,Sub_Counter,EntireLine_Dup,EntireLine_Counter
abc,10,eee,Yes,1,Yes,1,Yes,1,Yes,1
def,20,csc,Yes,1,No,1,Yes,1,No,1
abc,30,mec,Yes,2,No,1,No,1,No,1
ghi,40,sss,No,1,No,1,No,1,No,1
abc,10,eee,Yes,3,Yes,2,Yes,2,Yes,2
def,10,csc,Yes,2,Yes,3,Yes,2,No,1
搜索相似的案例并找到
uniq-c
command和
!所见[$1]+
似乎只生成唯一的值/行。请建议

编辑#1:

埃德·莫顿,为这篇拙劣的文章感到抱歉,我已经编辑了这篇文章。现在请查收。在实时场景中,我们从供应商处获得报价,如国家、地区、产品、产品代码、A-Z目的地的费率和成本信息 因此,我们将无法决定哪些重复的行需要删除,张贴上述人口,我们可以检查并迅速作出一些决定

例如,我试图检查$1字段中是否存在任何重复信息。在名称字段下,“abc”显示三次,“def”显示两次,“ghi”显示一次。因此,如果任何单词没有重复一次以上,则被视为“Name_Dup=No”,出现的计数为“Name_Counter=1”(即ghi)

其中“abc”出现3次,第一次出现时重复为“是”,计数为“Name_Dup=Yes”,计数为“Name_Counter=1”;第二次出现时重复为“Name_Dup=Yes”,计数为“Name_Counter=2”;第三次出现时重复为“Name_Dup=Yes”,计数为“Name_Counter=3”


然后需要检查$2、$3..直到$NF和$0..

awk解决方案:

awk 'function hasDupe(arr, f){ 
         return (arr[f]>1)? "Yes":"No" 
     }
     BEGIN{ FS=OFS="," }
     NR==1{ next }
     NR==FNR{ names[$1]++; ages[$2]++; subs[$3]++; all[$0]++; next }
     {
         if (FNR==1) 
             print $0,"Name_Dup,Name_Counter,Age_Dup,Age_Counter,Sub_Dup,Sub_Counter,EntireLine_Dup,EntireLine_Counter"; 
         else
             print $0,hasDupe(names,$1),++n[$1],hasDupe(ages,$2),++a[$2],hasDupe(subs,$3),++s[$3],hasDupe(all,$0),++all_lines[$0] 
     }' file
输出:

Name,Age,Sub,Name_Dup,Name_Counter,Age_Dup,Age_Counter,Sub_Dup,Sub_Counter,EntireLine_Dup,EntireLine_Counter
abc,10,eee,Yes,1,Yes,1,Yes,1,Yes,1
def,20,csc,Yes,1,No,1,Yes,1,No,1
abc,30,mec,Yes,2,No,1,No,1,No,1
ghi,40,sss,No,1,No,1,No,1,No,1
abc,10,eee,Yes,3,Yes,2,Yes,2,Yes,2
def,10,csc,Yes,2,Yes,3,Yes,2,No,1

您试图实现什么目标?我正在对awk“{print$0”,“++count[$1]}使用此命令'然后更改字段值以获得输出是的,但这显然不能解决问题。您当时尝试了什么?RomanPerekhrest,非常感谢您的支持,请建议如何使其通用。实际输入文件中的字段数过去变化不一,如10个字段,12个字段etc@AVN“欢迎。”通用“解决方案-这是另一个故事,需要另一个扩展的解决方案。目前,当前的解决方案适用于您当前的输入,并为您提供所需的答案。我完全不知道这个问题是关于什么的!埃德·莫顿,我已经编辑了这篇文章,请查收now@EdMorton谢谢坦率地说,我不是通过最初的描述,而是通过直觉来理解这个问题的