Bash 如何使用“将管道输出拆分为变量”\n\n“;而不是",\";用whileconstruct?
我有一个以下格式的数据文件:Bash 如何使用“将管道输出拆分为变量”\n\n“;而不是",\";用whileconstruct?,bash,text-processing,Bash,Text Processing,我有一个以下格式的数据文件: 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 想要的结束状态是一个变量,它包含来
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=…”
。好吧,如果您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
我认为这将继续从同一个stdin读取,但我不是100%确定
或者你可以创建自己的有限状态自动机(对不起,我只是喜欢这个声音):
如果要使用空行来确定新行的开头,它将如下所示(修改第二个解决方案):
这更适合带有自定义记录分隔符的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'
将记录分隔符设置为两个新行,然后$0
将为您提供块的所有数据
#/bin/bash
i=1
str=“”
读行时
做
如果($i%4==0))
然后
echo$str
#处理$str
str=“”
其他的
str=“$str\n$row”
fi
i=$($i+1))
完成<“mydatafile.txt”
想要的输出是什么?这很好,但是行中未知行数如何?空行表示行之间的更改?我喜欢第二种解决方案+1@PeterBowers:是的,空行是分隔符。那么我最后编辑的答案是否为您解决了它,@rsk82?我得到:row=[name=]row=[phone=]row=[address=]
对我来说很好,@alfasin。它确实保留了换行符-不确定这是否是预期的行为。。。哦,是的-重读OP问题,他确实想把\n
留在里面。不知道为什么,但这对我不起作用:
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
awk -v RS='\n\n' 'NF{printf "row=[%s]\n", $0}' file
row=[name=...
phone=...
address=..]
row=[name=...
phone=..
address=...]
row=[name=...
phone=...
address=...]
#!/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"