Bash 使用awk/sed将唯一值和时间戳差异重定向到文件

Bash 使用awk/sed将唯一值和时间戳差异重定向到文件,bash,awk,sed,grep,Bash,Awk,Sed,Grep,我想知道是否有人能给我一些关于我正在努力完成的任务的建议——我有点新手!:( 我有一个名为“stream.txt”的文本文件,其中有许多用分号分隔的字段,格式如下: field1=xxx;field2=xxx;field3=111222222;field4=xxx;field5=xxx field1=xxx;field2=xxx;field3=111222333;field4=xxx;field5=xxx field1=xxx;field2=xxx;field3=111222444;field4

我想知道是否有人能给我一些关于我正在努力完成的任务的建议——我有点新手!:(

我有一个名为“stream.txt”的文本文件,其中有许多用分号分隔的字段,格式如下:

field1=xxx;field2=xxx;field3=111222222;field4=xxx;field5=xxx
field1=xxx;field2=xxx;field3=111222333;field4=xxx;field5=xxx
field1=xxx;field2=xxx;field3=111222444;field4=xxx;field5=xxx
field1=xxx;field2=xxx;field3=111222444;field4=xxx;field5=xxx
field1=xxx;field2=xxx;field3=111222555;field4=xxx;field5=xxx
field1=xxx;field2=xxx;field3=111222777;field4=xxx;field5=xxx
field1=xxx;field2=xxx;field3=111222888;field4=xxx;field5=xxx
我要做的是使用awk/sed/grep搜索字段3的唯一值,并将它们重定向到另一个名为“differences.txt”的文件,该文件的值在字段3的值和以前的值之间存在差异。在上述示例中,我要查找以下输出:

111222333    111
111222444    111
111222555    111
111222777    222
111222888    111
我可以搜索字段3的值并重新接收它们,但我发现它需要在旁边显示该值与上一个值之间的差异。有人有什么建议吗

非常感谢!awk解决方案:

awk -F'[;=]' '!($6 in keys){ a[++c]=$6; keys[$6] }
     END{ delete keys; for(i=1;i<=NF;i++) if(a[i+1]) print a[i+1],a[i+1]-a[i] }' file > differences.txt
简要说明

  • gsub(/^.*=/,“”,$3
    :提取
    $3
  • a
    :用于存储差异
  • if(a>0&&$3-a>0){print$3,$3-a}
    :如果差值大于0,则打印
  • 您所需要的只是:

    $ awk -F'[=;]' 'NR>1 && $6!=p{print $6, $6-p} {p=$6}' file
    111222333 111
    111222444 111
    111222555 111
    111222777 222
    111222888 111
    

    @维拉曼:谢谢,如果这对您有所帮助,请检查并接受我的回答。:)
    $ awk -F';' '
        BEGIN{a=0} {gsub(/^.*=/,"",$3); 
        if(a>0 && $3-a>0){print $3,$3-a} a=$3}
      ' stream.txt > differences.txt
    
    $ cat differences.txt
    111222333 111
    111222444 111
    111222555 111
    111222777 222
    111222888 111
    
    $ awk -F'[=;]' 'NR>1 && $6!=p{print $6, $6-p} {p=$6}' file
    111222333 111
    111222444 111
    111222555 111
    111222777 222
    111222888 111