单行中的多行并从某些行中删除重复项

mutiple lines in single line and remove duplicates from some lines

这是我所拥有的,这是整个序列:

aa="aa1"
etime="1436262792"
from="joe"
test="blah"
test="blah1"
test="blah2"
addr="aa2";
aa="aa1"
etime="1436262792"
from="bob"
test="blah3"
addr="aa2";
etc...

有时测试线被限制为一条,但每条线以“;”分隔。 当有多个"test"时,我只需要保留最后一个

我正在尝试获得此结果:

aa="aa1" etime="1436262792" from="joe" test="blah2" addr="aa2";
aa="aa1" etime="1436262793" from="bob" test="blah3" addr="aa2";

这是我目前的发现;

cat file | xargs | tr ';' '\n;'

输出如下所示:

aa="aa1" etime="1436262793" from="joe" test="blah" test="blah2" test="blah3" addr="aa2"
aa="aa1" etime="1436262793" from="bob" test="blah3" test="blah3" addr="aa2"

感谢您的任何建议,

我会跟踪出现的以 test 开头的最后一行,并在一行不是这样开头时打印它:

$ awk '/^test/ {t=[=10=]; next} {if (t) print t; print; t=""}' file
aa="aa1"
etime="1436262792"
from="joe"
test="blah2"
addr="aa2";
aa="aa1"
etime="1436262792"
from="bob"
test="blah3"
addr="aa2";

然后通过管道传输到 xargs -n 5 以在每行 5 个字段的块上打印:

$ awk '/^test/ {t=[=11=]; next} {if (t) print t; print; t=""}' file | xargs -n 5
aa=aa1 etime=1436262792 from=joe test=blah2 addr=aa2;
aa=aa1 etime=1436262792 from=bob test=blah3 addr=aa2

在 sed 中

sed '/test/h;//!{x;//p;x;h};${//p};//d' file

在缓冲区中保留测试行,覆盖之前的直到没有并删除该行。

在下一个 none 测试行或文件末尾打印最后一个测试,假设已保存一个测试。

我也找到了这个...计算每行的字数...

    while read line;
    do
    COUNT=$(echo "${line}" | wc -w)

    if [ "${COUNT}" == "7" ]
    then
    echo ${line} | awk '{print ,,,,}' >> tmp8
    elif [ "${COUNT}" == "6" ]
    then
    echo ${line} | awk '{print ,,,,}' >> tmp8
    else
    echo ${line} | awk '{print ,,,,}' >> tmp8
    fi
    done < tmp7