3

给定的文件格式如下。

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 的重复重复次数,其余字段可以来自任何重复行。

通过这种方式,应从原始文件中删除 dups 并以上述格式显示。原始文件中的其余部分将是 uniq 的,它们将按原样进行......


我所做的是..

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 

但这需要再次回到原始文件以获取 dup 发生的行。..

让我不要混淆..这需要一个不同的观点..我的大脑正在坚持我的方法..需要一支雪茄..有什么想法......??

4

3 回答 3

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,请)

awk -F"," '{print $0,$1,$2,...}' file.txt | sort -k NUM,NUM2 | uniq -f NUM3 -c
于 2012-04-21T11:38:25.500 回答
0

句法 :

awk -F, '!(($1 SUBSEP $2 SUBSEP $5 SUBSEP $14) in 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) 条目的总和

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 | 排序 | 唯一的 -u -c

1 7

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

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

于 2012-08-21T10:07:24.867 回答
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
于 2012-04-21T18:21:59.257 回答