根据列格式化不带重复的行

时间:2015-04-22 05:24:23

标签: shell

需要你的帮助

我的文件如下。

04/22/2015 01:00  05/13/2015     8791 16736573  N  Cumulative I 0       0            CAP1    
04/21/2015 01:00  05/12/2015     8762 16733348  N  Cumulative I 0       0            CAP2
04/20/2015 19:25  05/11/2015      421   397297  N  Full Backup  0       0            CAP2
04/21/2015 20:01  05/12/2015        2      163  N  User Backup  0       0            CAP07_MD_Arch
04/21/2015 20:01  05/12/2015        1     1184  N  User Backup  0       0            CAP07_MD_Arch    
04/21/2015 20:00  05/12/2015        0        0  N  Full Backup  0       0            CAP2K_M_Arch
04/21/2015 18:00  05/12/2015   293393 48478527  N  Full Backup  0       0            CAP2K_M_Arch
04/21/2015 21:00  05/12/2015   293393 48478527  N  Full Backup  0       0            CAP2K_M_Arch
04/21/2015 01:01  05/12/2015     9249 17716144  N  Cumulative I 0       0            CAP05_WP1
04/13/2015 17:26  05/14/2015    63524 36108021  N  Full Backup  0       0            SID20
03/28/2015 12:00  04/28/2015    63491 35996931  N  Full Backup  0       0            SID20
03/21/2015 12:00  04/28/2015    63491 35996931  N  Full Backup  0       0            SID20

我上面有大量列表备份图像数据的文件,我打算成功收集LATEST"完全备份"所有客户。

因此请删除基于最后一列的重复项,并根据第一行(备份日期)显示最新的可用备份。

如下所示。

04/20/2015 19:25  05/11/2015      421   397297  N  Full Backup  0       0            CAP2
04/21/2015 21:00  05/12/2015   293393 48478527  N  Full Backup  0       0            CAP2K_M_Arch
04/13/2015 17:26  05/14/2015    63524 36108021  N  Full Backup  0       0            SID20

请帮助我们。

提前致谢。

2 个答案:

答案 0 :(得分:1)

鉴于您的数据似乎没有按日期时间顺序排列,并且您只对完整备份感兴趣,因此需要进行某种形式的过滤和排序,以确保文件中的最后一个是实际上最新的正确类型。此外,排序因美国日期格式而变得复杂,而不像yyyy-mm-dd那样容易做。

以下脚本将执行此操作:

pax> for id in $(awk '$7=="Full"{print $NF}' inputFile | sort -u); do
...>     awk -vX=$id '
...>         $NF==X && $7=="Full" {
...>             $1=substr($1,7,4)"-"substr($1,1,2)"-"substr($1,4,2);
...>             print
...>          }' inputFile | sort | tail -1
...>  done

2015-04-13 17:26 05/14/2015 63524 36108021 N Full Backup 0 0 SID20
2015-04-20 19:25 05/11/2015 421 397297 N Full Backup 0 0 CAP2
2015-04-21 21:00 05/12/2015 293393 48478527 N Full Backup 0 0 CAP2K_M_Arch

for语句根据每行的最后一列获取唯一 ID列表,然后迭代这些ID。 awk确保我们只获得完整备份,然后打印出每行上的最后一个字段,sort -u删除所有重复项。

为每个ID运行的内部行只是抓取所有完整备份行,其中最后一列是当前所需的ID值,对它们进行排序,使它们按升序日期/时间顺序排列,并打印出最后一行

答案 1 :(得分:0)

按日期顺序对输入进行排序,然后是awk one-liner:

cat INPUT_FILE | sort -t/ -k3.1,3.4 -k1 -k2 |
  awk '/Full Backup/ { backup[$(11)]=$0 } END { for(x in backup) print backup[x] }'

通过输入迭代,存储数组中遇到的最新备份日期。