Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何使用“将管道输出拆分为变量”\n\n“;而不是",\";用whileconstruct?_Bash_Text Processing - Fatal编程技术网

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"