我有一个采用以下格式的数据文件:
name=...
phone=...
address=..
name=...
phone=..
address=...
name=...
phone=...
address=...
并且我尝试使用while循环将其拆分为块,其中有一个空行“\ n \ n”。但是这种方法失败了。
cat mydatafile.txt | while read row; do
echo $row
# process the data
done
通缉的最终状态是一个包含三行内容的变量,在循环的每次迭代中都是row="name=...\nphone=...\naddress=..."
。
答案 0 :(得分:2)
好吧,如果你100%肯定会有你想要的3行,然后1个不需要的行,你可以做这样的事情:
cat mydatafile.txt | while read row1; do
read row2
read row3
read junk
row="$row1 $row2 $row3"
echo $row
# process the data
done
我认为将继续read
来自同一个标准输出,但我不是100%肯定。
或者你可以创建自己的有限状态自动机(对不起 - 我只是喜欢它的声音):
recno=0
cat mydatafile.txt | while read foo; do
let recno=recno+1
if [ $recno -lt 4 ]
then
row="$row $foo"
fi
if [ $recno == 4 ]
then
echo $row
# process the data
recno=0
row=''
fi
done
# Here you might want to check that you've processed the last data...
如果你想用一个空白行来确定新行的开头,它会看起来像这样(修改第二个解决方案):
cat mydatafile.txt | while read foo; do
if [ -z "$foo" ]
then
echo $row
# process the data
row=''
else
row="$row $foo"
fi
done
# Here you NEED to process the last row unless the file ended in a blank line
答案 1 :(得分:0)
这更适合使用自定义记录分隔符进行awk:
awk -v RS='\n\n' 'NF{printf "row=[%s]\n", $0}' file
row=[name=...
phone=...
address=..]
row=[name=...
phone=..
address=...]
row=[name=...
phone=...
address=...]
-v RS='\n\n'
将记录分隔符设置为2个新行,然后$0
为您提供块的所有数据。
答案 2 :(得分:0)
#!/bin/bash
i=1
str=""
while read row
do
if (($i % 4 == 0 ))
then
echo $str
# process $str
str=""
else
str="$str\n$row"
fi
i=$(($i+1))
done < "mydatafile.txt"