Chinaunix

标题: 【已解决】求一个统计行重复的AWK脚本 [打印本页]

作者: lanfeng356    时间: 2017-03-09 11:31
标题: 【已解决】求一个统计行重复的AWK脚本
本帖最后由 lanfeng356 于 2017-03-09 17:35 编辑

原始文件:
000A 000861
000B 000861
100A 000118
000B 000861
000C 000861
100B 000118
100A 000118
000C 000861
100B 000118
100A 000118



...总计1万行
要求:文件总计1万行,输出1万行,顺序和原来1万行一样;
        如果某行在文件中只出现一次,在行前打印 否 是 1
        如果某行在文件中出现多次,第一次统计时,在行前打印 是 是 1,第n(n>=2)次时,打印 是 否 n

以上原始文件想要的结果:
否 是 1 000A 000861
是 是 1 000B 000861
是 是 1 100A 000118
是 否 2 000B 000861
否 是 1 000C 000861
是 否 1 100B 000118
是 否 2 100A 000118
是 否 2 100B 000118
是 否 3 100A 000118



...一万行顺序和原始文件一样

求各位大侠给个AWK脚本。



作者: haooooaaa    时间: 2017-03-09 12:10
  1. awk 'NR==FNR{a[$0]++;next}{if(a[$0]==1)$1="否 是 1 "$1;else if($0 in b)$1="是 是 "a[$0]" "$1;else{b[$0];$1="是 否 "a[$0]" "$1}}1' a a
复制代码

作者: moperyblue    时间: 2017-03-09 15:33
本帖最后由 moperyblue 于 2017-03-09 15:38 编辑
  1. awk 'NR==FNR{a[$0]++;next}{print a[$0]<2?"否 是 1":++b[$0]<2?"是 是":"是 否",b[$0],$0}' file file
复制代码

作者: lanfeng356    时间: 2017-03-09 15:48
回复 2# haooooaaa

非常感谢大侠,我还有几个点不太理解,还请大侠赐教:1.awk 'NR==FNR{a[$0]++;next}{if(a[$0]==1)$1="否 是 1 "$1;else if($0 in b)$1="是 是 "a[$0]" "$1;else{b[$0];$1="是 否 "a[$0]" "$1}}1' a a 这个脚本中的b是怎么理解?
2.awk 'NR==FNR{a[$0]++;next}{if(a[$0]==1)$1="否 是 1 "$1;else if($0 in b)$1="是 是 "a[$0]" "$1;else{b[$0];$1="是 否 "a[$0]" "$1}}1' a a  脚本中最后的这个1是什么意思?我测试这个1和输出有关,没理解为什么有这个非0的数字就会打印,没有这个数字或者数字为0就不会打印呢?

作者: lanfeng356    时间: 2017-03-09 15:48
回复 2# haooooaaa

非常感谢大侠,我还有几个点不太理解,还请大侠赐教:
1.awk 'NR==FNR{a[$0]++;next}{if(a[$0]==1)$1="否 是 1 "$1;else if($0 in b)$1="是 是 "a[$0]" "$1;else{b[$0];$1="是 否 "a[$0]" "$1}}1' a a 这个脚本中的b是怎么理解?
2.awk 'NR==FNR{a[$0]++;next}{if(a[$0]==1)$1="否 是 1 "$1;else if($0 in b)$1="是 是 "a[$0]" "$1;else{b[$0];$1="是 否 "a[$0]" "$1}}1' a a  脚本中最后的这个1是什么意思?我测试这个1和输出有关,没理解为什么有这个非0的数字就会打印,没有这个数字或者数字为0就不会打印呢?

作者: lanfeng356    时间: 2017-03-09 16:00
回复 3# moperyblue

awk 'NR==FNR{a[$0]++;next}{print a[$0]<2?"否 是 1":++b[$0]<2?"是 是":"是 否",b[$0],$0}' file file

两位大侠都提到了b这个参数,请赐教这个b怎么理解?

作者: moperyblue    时间: 2017-03-09 16:05
回复 6# lanfeng356


数组名称而已 用c或dd等其它字符或字符串表示都可以
作者: lanfeng356    时间: 2017-03-09 16:57
回复 7# moperyblue

awk 'NR==FNR{a[$0]++;next}{print a[$0]<2?"否 是 1":++b[$0]<2?"是 是":"是 否",b[$0],$0}' file file
我大概理解了,这个b[$0]是在读取第二个文件时,新建的数组,而a[$0]是读取第一个文件时的数组。

膜拜了,二位大侠~




作者: sunzhiguolu    时间: 2017-03-09 20:37
那个 b 主要是用来处理某行的计数器。
作者: 本友会机友会摄友会    时间: 2017-03-10 16:10
提示: 作者被禁止或删除 内容自动屏蔽
作者: sunzhiguolu    时间: 2017-03-10 20:37
本帖最后由 sunzhiguolu 于 2017-03-10 20:42 编辑

powershell 看着的确很强大,和 C# 语言类库 类名 也非常的相似。
就是比较考验记忆力,要是 IDE 提供类似 VS 智能感知的话还好些。
有一点不是很理解,你总是说 PK 性能 这个和语言本身好像没啥大关系,倒是和编码的业务逻辑处理的关系比较紧密。(算法)

要是楼主方便的话,可以将示例数据挂到百度网盘。满足高手的效能欲。

作者: sunzhiguolu    时间: 2017-03-10 21:23
测试环境 - Windows 7
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use utf8;
  5. use Encode qw /encode/;

  6. my (@aData , %hStat);
  7. while (<DATA>){
  8.         push (@aData, $_);
  9.         $hStat{$_}{'C'}++;
  10. }

  11. my @aMsg = ('否 是', '是 是', '是 否');
  12. foreach (@aData){
  13.         my ($pos, $no) = (0, 1);
  14.         if ($hStat{$_}{'C'} > 1){
  15.                 $pos = $hStat{$_}{'c'}++ ? -1 : 1;
  16.                 $no = $hStat{$_}{'c'};
  17.         }
  18.         print encode ('cp936', "$aMsg[$pos] $no $_");
  19. }

  20. __DATA__
  21. 000A 000861
  22. 000B 000861
  23. 100A 000118
  24. 000B 000861
  25. 000C 000861
  26. 100B 000118
  27. 100A 000118
  28. 000C 000861
  29. 100B 000118
  30. 100A 000118
复制代码


perl abc.pl
-----------------------------
否 是 1 000A 000861
是 是 1 000B 000861
是 是 1 100A 000118
是 否 2 000B 000861
是 是 1 000C 000861
是 是 1 100B 000118
是 否 2 100A 000118
是 否 2 000C 000861
是 否 2 100B 000118
是 否 3 100A 000118
作者: sditmaner    时间: 2017-03-11 22:54
回复 2# haooooaaa
作者: wh7211    时间: 2017-11-15 20:25
  1. awk '{a[NR]=$0;b[$0]++;c[NR]=b[$0]}END{for(i=1;i<=NR;i++){print b[a[i]]==1?"否 是 1 "a[i]:c[i]==1?"是 是 1 "a[i]:"是 否 "c[i]" "a[i]}}' file
复制代码

输出:
否 是 1 000A 000861
是 是 1 000B 000861
是 是 1 100A 000118
是 否 2 000B 000861
是 是 1 000C 000861
是 是 1 100B 000118
是 否 2 100A 000118
是 否 2 000C 000861
是 否 2 100B 000118
是 否 3 100A 000118
     





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2