我想在行下面打印/回显或重定向到某个文件
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
对此有没有更好或更清洁的替代方案?
答案 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
使用paste
和sed
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"