将多对线更改为单行?

时间:2017-02-15 10:37:46

标签: bash awk sed

我想在行下面打印/回显或重定向到某个文件

phone: "3434343"
name: "jack"

phone: "9876735"
name: "john"

phone: "3434343"
name: "Mack"


...multiple emptylines ...


phone: "9876735"
name: "doe"

phone: "3434343"
name: "tack"

所需的输出行是: -

phone: "3434343" name: "jack"
phone: "9876735" name: "john"

 ...

以下是我编写的内容

cat /tmp/sip_summary2.log | while  read LINE; 
do
echo $LINE | grep '^$' > /dev/null
    if [ $? -eq 0 ]
        then
      echo " " >> /tmp/tempsip.log 
    else
      printf "%s " "$LINE" >> /tmp/tempsip.log
    fi
done

对此有没有更好或更清洁的替代方案?

7 个答案:

答案 0 :(得分:8)

awk解决方案:

awk -v RS= '{$1=$1}1' inputfile

此处默认RS更改为空白。 {$1=$1}用于记录重建,1用于打印记录。

答案 1 :(得分:4)

Python解决方案。逐行阅读并使用或不使用换行符打印,具体取决于前缀:

with open("text.txt") as f:
  for l in f:
    l = l.strip()
    if l.startswith("phone:"):
        print(l,end=' ')
    elif l.startswith("name:"):
        print(l)

打印:

phone: "3434343" name: "jack"
phone: "9876735" name: "john"
phone: "3434343" name: "Mack"
phone: "9876735" name: "doe"
phone: "3434343" name: "tack"

答案 2 :(得分:1)

另一种基于Awk getline()函数的解决方案,

awk 'NF{key=$0; getline; print key, $0;}' file
phone: "3434343" name: "jack"
phone: "9876735" name: "john"
phone: "3434343" name: "Mack"
phone: "9876735" name: "doe"
phone: "3434343" name: "tack"

即。对于每个非空行NF{},将当前行存储在变量key中,读取下一行,现在变为$0并打印出来。

答案 3 :(得分:1)

使用sed

sed -e '/phone:/{N; /\nname/{s/\n/ /g;p;d}}' -e '/^\s*$/d'

(OR)

sed -e '/phone:/{N; s/\n\(name:\)\?/ \1/}' -e '/^\s*$/d'

<强>测试

$ sed -e '/phone:/{N; /\nname/{s/\n/ /g;p;d}}' -e '/^\s*$/d' file
phone: "3434343" name: "jack"
phone: "9876735" name: "john"
phone: "3434343" name: "Mack"
phone: "9876735" name: "doe"
phone: "3434343" name: "tack"

答案 4 :(得分:1)

pr是分组连续行的不错选择。例如,将10行分为5列,,作为分隔符

$ seq 10 | pr -5ats,
1,2,3,4,5
6,7,8,9,10


对于给定的输入,还需要预处理以仅获得非空行

$ grep -vx '' ip.txt
phone: "3434343"
name: "jack"
phone: "9876735"
name: "john"
phone: "3434343"
name: "Mack"
phone: "9876735"
name: "doe"
phone: "3434343"
name: "tack"

然后使用pr

$ grep -vx '' ip.txt | pr -2ats' '
phone: "3434343" name: "jack"
phone: "9876735" name: "john"
phone: "3434343" name: "Mack"
phone: "9876735" name: "doe"
phone: "3434343" name: "tack"

答案 5 :(得分:0)

在awk中,使用内容来控制print ing:

$ awk '/^name/{print p, $0}/^phone/{p=$0}' file
phone: "3434343" name: "jack"
phone: "9876735" name: "john"
phone: "3434343" name: "Mack"

如果phone,请将行存储到p。如果name print p和当前记录$0

答案 6 :(得分:0)

仅使用bash的另一种解决方案

unset v;
i=0; 
for d in `cat file`; do 
    v[$i]="$d";
    ((++i));
    if [ "$i" -eq 4 ]; then
        printf '%s\n' "${v[*]}";
        i=0;
    fi;
done

使用pastesed

的另一种解决方案
sed '/^$/d' file | paste -d" " - -

你明白了,

phone: "3434343" name: "jack"
phone: "9876735" name: "john"
phone: "3434343" name: "Mack"
phone: "9876735" name: "doe"
phone: "3434343" name: "tack"