linux - awk或sed或sort -filter文本文件,根据规则消除一些重复行

时间:2016-03-10 17:59:56

标签: sorting awk sed

我有一个包含可变行数的文件,如:

  cn015 00:00:02  0   0.00  99.00
  cn015 00:00:02  1   0.00  99.00 
  cn015 01:00:01  0   0.00  99.00 
  cn015 01:00:01  1   0.00  99.00 
  cn015 01:00:02  0   0.00  99.00 
  cn015 01:00:02  1   0.00  99.00 
  cn015 02:00:01  0   0.00  99.00 
  cn015 02:00:01  1   0.00  99.00 
  cn017 11:00:01  0  24.41  74.59 
  cn017 11:00:01  1  24.90  74.10 
  cn017 11:00:02  0  95.96   3.04 
  cn017 11:00:02  1  96.04   2.96 
  cn017 12:00:01  0  30.34  68.66 
  cn017 12:00:01  1  31.24  67.76 
  cn017 12:00:02  0   0.00  99.00 
  cn017 12:00:02  1   0.00  99.00 
  • 第一列是文字
  • 第二列是时间字段
  • 第三个是数字

我想获得这样的文件:

  cn015 00:00:02  0   0.00  99.00 
  cn015 00:00:02  1   0.00  99.00 
  cn015 01:00:01  0   0.00  99.00 
  cn015 01:00:01  1   0.00  99.00 
  cn015 02:00:01  0   0.00  99.00 
  cn015 02:00:01  1   0.00  99.00 
  cn017 11:00:01  0  24.41  74.59 
  cn017 11:00:01  1  24.90  74.10 
  cn017 12:00:01  0  30.34  68.66 
  cn017 12:00:01  1  31.24  67.76 

对于每个cn,我只会有每小时的第一行(在本例中,只有

  cn015 00:00:02  0   0.00  99.00
  cn015 00:00:02  1   0.00  99.00 
<00>对于cn015 00:00)

我更喜欢使用awk的答案,但可以接受sedsort

1 个答案:

答案 0 :(得分:1)

awk救援!

  $ awk '{split($2,t,":")} !a[$1,t[1],$3]++' file

  cn015 00:00:02  0   0.00  99.00
  cn015 00:00:02  1   0.00  99.00
  cn015 01:00:01  0   0.00  99.00
  cn015 01:00:01  1   0.00  99.00
  cn015 02:00:01  0   0.00  99.00
  cn015 02:00:01  1   0.00  99.00
  cn017 11:00:01  0  24.41  74.59
  cn017 11:00:01  1  24.90  74.10
  cn017 12:00:01  0  30.34  68.66
  cn017 12:00:01  1  31.24  67.76

为每个给定小时打印唯一第一个和第三个字段的行。这是我对这个问题的理解。