Bash删除列中的重复条目

时间:2015-03-23 10:35:06

标签: bash

我希望删除第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

许多人寻求帮助

4 个答案:

答案 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列...... ^^