切|排序| Uniq -d -c |但?

时间:2012-04-21 11:09:41

标签: shell

给定的文件格式如下。

GGRPW,33332211,kr,P,SUCCESS,systemrenewal,REN,RAMS,SAA,0080527763,on:X,10.0,N,20120419,migr
GBRPW,1232221,uw,P,SUCCESS,systemrenewal,REN,RAMS,ASD,20075578623,on:X,1.0,N,20120419,migr
GLSH,21122111,uw,P,SUCCESS,systemrenewal,REN,RAMS,ASA,0264993503,on:X,10.0,N,20120419,migr

我需要取出重复项和计数(每个重复项分类为f1,2,5,14)。然后使用第一个重复出现记录整个字段插入到数据库中,并在另一列中标记计数(重复)。为此,我需要剪切所有4个提到的字段并使用uniq -d排序和查找重复,并使用-c的计数。现在,在重复整理后再次回来并计算我需要输出为以下形式。

3,GLSH,21122111,uw,P,SUCCESS,systemrenewal,REN,RAMS,ASA,0264993503,on:X,10.0,N,20120419,migr

其中三个是f1,2,5,14的重复重复次数,其余字段可以来自任何一行。

通过这种方式,应该从原始文件中删除重复并以上述格式显示。 原始文件中的剩余部分将是单独的,因为它是......


我所做的是......

awk '{printf("%5d,%s\n", NR,$0)}' renewstatus_2012-04-19.txt > n_renewstatus_2012-04-19.txt 
cut -d',' -f2,3,6,15 n_renewstatus_2012-04-19.txt |sort | uniq -d -c 

但是这需要再次回到原始文件以获取重复出现的行。 ..

让我不要混淆..这需要一个不同的观点..我的大脑紧紧抓住我的方法..需要一支雪茄.. 任何thots ...... ??

3 个答案:

答案 0 :(得分:4)

sort有一个选项 -k

   -k, --key=POS1[,POS2]
          start a key at POS1, end it at POS2 (origin 1)

uniq有一个选项 -f

   -f, --skip-fields=N
          avoid comparing the first N fields

所以使用字段编号排序和uniq(计数NUM并自己测试此cmd,PLZ)

awk -F"," '{print $0,$1,$2,...}' file.txt | sort -k NUM,NUM2 | uniq -f NUM3 -c

答案 1 :(得分:0)

使用awk的关联数组是查找唯一/重复行的便捷方法:

awk '
    BEGIN {FS = OFS = ","}
    {
        key = $1 FS $2 FS $5 FS $14
        if (key in count) 
            count[key]++
        else {
            count[key] = 1
            line[key] = $0
        }
    }
    END {for (key in count) print count[key], line[key]}
' filename

答案 2 :(得分:0)

语法:

awk -F,'!(($ 1 SUBSEP $ 2 SUBSEP $ 5 SUBSEP $ 14)uniq){uniq [$ 1,$ 2,$ 5,$ 14] = $ 0} {count [$ 1,$ 2,$ 5,$ 14] ++} END {for(i in count){if(count [i]> 1)file =“dupes”; else file =“uniq”; print uniq [i],“,”count [i]> file}}'renewstatus_2012-04-19.txt

计算:

sym @ localhost:〜$ cut -f16 -d','uniq |排序| uniq -d -c 124275 1 -----> UNIQ(1)ENTRIES的总和

sym @ localhost:〜$ cut -f16 -d','dupes |排序| uniq -d -c 3860 2 850 3 71 4 7 5 3 6 sym @ localhost:〜$ cut -f16 -d','dupes |排序| uniq -u -c

1 7

10614 ------>与其数量相乘的重复条目的总和

sym @ localhost:〜$ wc -l renewstatus_2012-04-19.txt 134889 renewstatus_2012-04-19.txt --->原始文件的总行数,与(124275 + 10614)= 134889

完全匹配