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
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 编辑
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
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use Encode qw /encode/;
my (@aData , %hStat);
while (<DATA>){
push (@aData, $_);
$hStat{$_}{'C'}++;
}
my @aMsg = ('否 是', '是 是', '是 否');
foreach (@aData){
my ($pos, $no) = (0, 1);
if ($hStat{$_}{'C'} > 1){
$pos = $hStat{$_}{'c'}++ ? -1 : 1;
$no = $hStat{$_}{'c'};
}
print encode ('cp936', "$aMsg[$pos] $no $_");
}
__DATA__
000A 000861
000B 000861
100A 000118
000B 000861
000C 000861
100B 000118
100A 000118
000C 000861
100B 000118
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
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