我希望删除第1列中的重复数据,并保留第一列。
从:
Date Time cnt
01/03/2015 18:02:06 0
01/03/2015 18:03:07 0
01/03/2015 18:04:07 0
02/03/2015 18:02:07 0
02/03/2015 18:03:07 0
02/03/2015 18:04:07 0
02/03/2015 18:05:08 0
02/03/2015 18:06:06 0
03/03/2015 18:02:06 0
03/03/2015 18:03:06 0
03/03/2015 18:04:07 0
03/03/2015 18:05:07 0
03/03/2015 18:06:07 0
为:
Date Time cnt
01/03/2015 18:02:06 0
18:03:07 0
18:04:07 0
18:05:07 0
18:06:07 0
02/03/2015 18:02:07 0
18:03:07 0
18:04:07 0
18:05:08 0
18:06:06 0
03/03/2015 18:02:06 0
18:03:06 0
18:04:07 0
18:05:07 0
18:06:07 0
许多人寻求帮助
答案 0 :(得分:3)
使用 awk :
awk '{if(a[$1]++){printf("\t %s\t%s\n", $2, $3)}else{print}}' File
对于第一次遇到的每个column1
值(i.e a[$1] = 0
),按原样打印该行(由else部分完成)。对于重复的column1
值,请勿打印第一列(缩进的选项卡格式)。
<强>示例:强>
AMD$ awk '{if(a[$1]++){printf("\t %s\t%s\n", $2, $3)}else{print}}' ff
Date Time cnt
01/03/2015 18:02:06 0
18:03:07 0
18:04:07 0
02/03/2015 18:02:07 0
18:03:07 0
18:04:07 0
18:05:08 0
18:06:06 0
03/03/2015 18:02:06 0
18:03:06 0
18:04:07 0
18:05:07 0
18:06:07 0
答案 1 :(得分:0)
这是未经测试的,不是bash,但你可以使用perl。
将每一行拆分为日期,时间,计数。
检查哈希,看看你之前是否见过这个日期。
如果不是,请打印日期,时间,计数。
如果是,请打印标签,时间,计数。
use strict;
my $hash;
while(<>){
chomp;
my ($date, $time, $count)= split;
if (defined($hash{$date})){
print "\t\t$time\t$count\n";
}
else{
print "$date\t$time\t$count\n";
$hash{$date}=1;
}
答案 2 :(得分:0)
用红宝石单线:
ruby -ne 'BEGIN{ h={} }; items = $_.partition(" "); items[0] = h[items[0]] ? " "*items[0].size : items[0]; puts items.join(); h[items[0]] = true '
答案 3 :(得分:0)
谢谢大家的回答!
Perl,Bash,Awk工作得很好,但Ruby更灵活,因为事实上,之后有20列...... ^^