单行多行并删除某些行的重复行

时间:2015-07-09 08:33:32

标签: bash shell sequence 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...

有时候测试线被限制为一个,但是每个都用&#34 ;;"分开。 当有多个" 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"

感谢您提出任何建议,

的Al。

3 个答案:

答案 0 :(得分:2)

我会跟踪出现的test开头的最后一行,当一行没有像这样开始时打印出来:

$ awk '/^test/ {t=$0; 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=$0; 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

答案 1 :(得分:1)

在sed

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

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

在下一个无测试行或文件末尾,它会打印最后一个测试,因为保存了一个。

答案 2 :(得分:0)

我已经发现了这个......计算每行的单词数量......

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

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