awk根据特定列数据创建保存重复数的列

时间:2016-12-21 15:57:23

标签: unix awk count counter

在以下data.txt文件中,第2列和第3列中的值在几行内重复(尽管行不相同):

cat data.txt > 
Julie   Andrews jand    109
Julie   Andrews jand    119
John    Thomas  jd      301
Alex    Tremble atrem   415
Alex    Tremble atrem   3415
Alan    Tremble atrem   215
John    Tomas   jd      302
John    Tomas   jd      3302
John    Tomas   jd      3402
John    Tomas   jd      33302
Alex    Trebe   atrem   416

如何添加指定最大重复次数的第5列,基于第2列和第2列。每行3个内容? 例如,期望的输出将如下所示:

cat desired.output.txt > 
Julie   Andrews jand    109     2
Julie   Andrews jand    119     2
John    Thomas  jd      301     1
Alex    Tremble atrem   415     3
Alex    Tremble atrem   3415    3
Alan    Tremble atrem   215     3
John    Tomas   jd      302     4
John    Tomas   jd      3302    4
John    Tomas   jd      3402    4
John    Tomas   jd      33302   4
Alex    Trebe   atrem   416     1

目前我有以下命令,它为每个副本创建一个简单的计数器(但是,这不是所需的输出):

awk -F "\t" '{OFS="\t"}{print $0,++cnt[$2,$3]}' data.txt
Julie   Andrews jand    109     1
Julie   Andrews jand    119     2
John    Thomas  jd  301 1
Alex    Tremble atrem   415 1
Alex    Tremble atrem   3415    2
Alan    Tremble atrem   215 3
John    Tomas   jd  302 1
John    Tomas   jd  3302    2
John    Tomas   jd  3402    3
John    Tomas   jd  33302   4
Alex    Trebe   atrem   416 1

1 个答案:

答案 0 :(得分:4)

最简单且未分类的文件是双重扫描输入文件

$ awk -v OFS='\t' 'NR==FNR {count[$2,$3]++; next} 
                           {print $0, count[$2,$3]}' file{,}

Julie   Andrews jand    109     2
Julie   Andrews jand    119     2
John    Thomas  jd      301     1
Alex    Tremble atrem   415     3
Alex    Tremble atrem   3415    3
Alan    Tremble atrem   215     3
John    Tomas   jd      302     4
John    Tomas   jd      3302    4
John    Tomas   jd      3402    4
John    Tomas   jd      33302   4
Alex    Trebe   atrem   416     1

如果您的文件已排序或太大,您可以收集所有条目,并在上下文更改时打印计数。

ps。请注意file{,}file file两次处理同一文件的bash简写。