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

时间:2017-06-23 07:01:12

标签: 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=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搜索field3的唯一值,并将它们重定向到另一个名为“differences.txt”的文件,其中field3值和之前的值之间的值不同。在上面的例子中,我正在寻找以下输出:

111222333    111
111222444    111
111222555    111
111222777    222
111222888    111

我可以搜索field3的值并重定向它们,但我发现它可以获得值和前一个值之间的差异以显示它旁边。有人有任何提示吗?

非常感谢提前!

3 个答案:

答案 0 :(得分:0)

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

结果

> cat differences.txt 
111222444 111
111222555 111
111222777 222
111222888 111

答案 1 :(得分:0)

$ 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

简要说明,

  1. gsub(/^.*=/,"",$3:提取$3
  2. 的数字部分
  3. a:是存储差异
  4. if(a>0 && $3-a>0){print $3,$3-a}:如果差异大于0
  5. 则打印

答案 2 :(得分:0)

您只需要:

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