如何使用shell脚本找到文件列的唯一组合的下一个可用性

如何使用shell脚本找到文件列的唯一组合的下一个可用性,shell,awk,Shell,Awk,我想得到具有唯一文件列组合的行的时差 例: 在上面的文件示例中,我正在对第一和第七列进行唯一的组合,并且找到下一个可用的相同组合的时间差,例如,考虑第一行,在这里,我检查第一和第七列“C”、“I/O”的唯一组合,寻找下一个可用的组合。 C|IGA LA TESTFEED|mpg-fa-29-9-AnacDu23.gdl.mex.ibm.com|03/07/2016|00:00:56||I/O|12413508|2266556|2253044|300 具有相同组合的下一个可用行 C|IGA LA

我想得到具有唯一文件列组合的行的时差

例:

在上面的文件示例中,我正在对第一和第七列进行唯一的组合,并且找到下一个可用的相同组合的时间差,例如,考虑第一行,在这里,我检查第一和第七列“C”、“I/O”的唯一组合,寻找下一个可用的组合。

C|IGA LA TESTFEED|mpg-fa-29-9-AnacDu23.gdl.mex.ibm.com|03/07/2016|00:00:56||I/O|12413508|2266556|2253044|300
具有相同组合的下一个可用行

C|IGA LA TESTFEED|mpg-fa-29-9-AnacDu23.gdl.mex.ibm.com|03/07/2016|00:05:56||I/O|12413508|2266556|2253044|300
这是我的试用码,但我没有得到正确的答案:

awk -F'|' 'BEGIN{OFS=FS} {k=$7 FS $7} k in a{print $1,$7,$5"-"a[k]} {a[k]=$5}'  'M02232016.IGA-US-TESTFEED.dat' times |  column -t -s'|' | grep '/' | sort -u | head

如果您试图找到唯一组合的第二个实例,您可以使用此

$ awk -F'|' '{a[$1,$7]++} a[$1,$7]==2' file

C|IGA LA TESTFEED|mpg-fa-29-9-AnacDu23.gdl.mex.ibm.com|03/07/2016|00:05:56||I/O|12413508|2266556|2253044|300
C|IGA LA TESTFEED|mpg-fa-29-9-AnacDu23.gdl.mex.ibm.com|03/07/2016|00:07:11||Driver text|40|1048536|1048532|300
C|IGA LA TESTFEED|mpg-fa-29-9-AnacDu23.gdl.mex.ibm.com|03/07/2016|00:09:07||Processor|40750972|25824812|16768820|300
但是,也许你在尝试别的东西。如果是这样,请更新原始帖子的详细信息

以下是《泰晤士报》的两两差异

$ awk -F'|' 'BEGIN{OFS=FS}
                {k=$1 FS $7}
          k in a{print $1,$7,$5"-"a[k]} {a[k]=$5}' times | 
  column -t -s'|'

C  I/O          00:05:56-00:00:56
C  Driver text  00:07:11-00:02:11
C  Processor    00:09:07-00:04:07
C  I/O          00:10:56-00:05:56
C  Driver text  00:12:11-00:07:11
C  Processor    00:14:07-00:09:07
这计算秒数

$ awk -F'|' 'BEGIN{OFS=FS}
                  {k=$1 FS $7}
            k in a{split(a[k],p,":"); 
                   split($5,n,":"); 
                   t=((n[1]-p[1])*60+(n[2]-p[2]))*60+n[3]-p[3]; 
                   print $1,$7,$5"-"a[k],t} {a[k]=$5}' times | 
  column -t -s'|'          

C  I/O          00:05:56-00:00:56  300
C  Driver text  00:07:11-00:02:11  300
C  Processor    00:09:07-00:04:07  300
C  I/O          00:10:56-00:05:56  300
C  Driver text  00:12:11-00:07:11  300
C  Processor    00:14:07-00:09:07  300

不清楚你想做什么。您是否正在尝试打印$1和$7的唯一组合的第二个实例?我想要$1和$7的组合之间的时间差(第5列),以及该组合的下一个可用实例。不过,您的代码甚至不会尝试采取任何差异!你能公布你想要的最终结果吗。这里每个键有两个差异(三个实例之间)。以这一行为例:C | IGA LA TESTFEED | mpg-fa-29-9-AnacDu23.gdl.mex.ibm.com | 03/07/2016 | 00:00:56 | I/O 12413508 1246556 | 225044 | 300,它已经搜索了第1列和第7列的下一个可用组合及其时差。C | IGA LA TESTFEED | mpg-fa-29-9-AnacDu23.gdl.mex.ibm.com | 03/07/2016 | 00:05:56 | I/O 12413508 1246556ゥ225044ゥ300,结果应该是00:56,00:05:56,这样它必须找出所有1美元和7美元的组合及其下一个可用实例的时差……是的,它们的出现意味着多少秒差,第一个实例是C | IGA LA TESTFEED | mpg-fa-29-9-AnacDu23.gdl.mex.ibm.com | 03/07/2016 | 00:00:56 | I/O 12413508 1246556 | 225044 | 300第二个实例是C | IGA LATESTFEED | mpg-fa-29-9-AnacDu23.gdl.mex.ibm.com | 03/07/2016 | 00:05:56 | I/O 12413508 1246556 | 225044 | 300@karakfa,感谢您的解决方案。你的计算几乎是正确的,在这种情况下,我正在寻找下一个独特的组合实例。例:C I/O,我们需要查看C I/O及其日期时间列的下一个组合。请更新您的解决方案。输出应如下所示:C I/O 00:05:56-00:00:56 300 C驱动程序文本00:07:11-00:02:11 300 C处理器00:09:07-00:04:07 300 C I/O 00:10:56-00:05:56 300 C驱动程序文本00:12-11-00:07:11 300 C处理器00:14:07-00:09:07 300如果只查找特定的键值,只需将
{k=$1…}
替换为
{k=“C”FS“I/O”}
$ awk -F'|' 'BEGIN{OFS=FS}
                  {k=$1 FS $7}
            k in a{split(a[k],p,":"); 
                   split($5,n,":"); 
                   t=((n[1]-p[1])*60+(n[2]-p[2]))*60+n[3]-p[3]; 
                   print $1,$7,$5"-"a[k],t} {a[k]=$5}' times | 
  column -t -s'|'          

C  I/O          00:05:56-00:00:56  300
C  Driver text  00:07:11-00:02:11  300
C  Processor    00:09:07-00:04:07  300
C  I/O          00:10:56-00:05:56  300
C  Driver text  00:12:11-00:07:11  300
C  Processor    00:14:07-00:09:07  300