Bash 使用awk/sed将唯一值和时间戳差异重定向到文件
我想知道是否有人能给我一些关于我正在努力完成的任务的建议——我有点新手!:( 我有一个名为“stream.txt”的文本文件,其中有许多用分号分隔的字段,格式如下: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
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