如何使用" \ n \ n"将输出从管道拆分为变量而不是" \ n"与contruct一起?

时间:2015-03-29 15:57:47

标签: 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

通缉的最终状态是一个包含三行内容的变量,在循环的每次迭代中都是row="name=...\nphone=...\naddress=..."

3 个答案:

答案 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为您提供块的所有数据。

Working Demo

答案 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"