在循环中捕获第一次和第二次模式之间的数据

时间:2017-02-06 06:59:15

标签: linux unix

我需要文件中模式之间的数据

文件中的数据如下

cat file1
# Wed 06-02-2017
field1=abc
field2=xyz
field3=ijk
# Wed 06-02-2017
field1=123
field2=456
field3=789
# Wed 06-02-2017
field1=a1a
field2=c1c
field3=d1d

我想运行循环并在第一个循环中找到第一次和第二次出现的模式之间的数据<#>然后在第二个循环中我想要第二个和第三个模式之间的数据<#>等等。

下面是为此编写的代码,但它无法正常工作

cat caturedata
#!/bin/sh

lastlineno=$(wc -l file1 | awk {'print$1'})
echo $lastlineno
for (( i=1;i<=$lastlineno;i=a))
do
        echo "Inside Loop : $i"
        sed '"$i",/#/d;/#/,$d' file1
        temp=$(sed '"$i",/#/d;/#/,$d' file1 | wc |awk '{print $1}')
        a=i+temp+1
done

我正在尝试查找文件的最后一个行号 然后在第1行和最后一行号之间运行一个循环 然后运行sed命令捕获第一次和第二次出现的模式之间的数据 然后确定以

开头的下一行号

输出应如下

Inside Loop : 1
field1=abc
field2=xyz
field3=ijk
Inside Loop : 5
field1=123
field2=456
field3=789
Inside Loop : 9
field1=a1a
field2=c1c
field3=d1d

2 个答案:

答案 0 :(得分:0)

您可以先使用awk:

合并# Wed xx-xxx-2017分割的同一块
awk '{if($0 !~ /^#/){printf",%s",$0} else {printf "\n%s",$0}}' xxx.txt 

# Wed 06-02-2017,field1=abc,field2=xyz,field3=ijk
# Wed 06-02-2017,field1=123,field2=456,field3=789
# Wed 06-02-2017,field1=a1a,field2=c1c,field3=d1d

然后进行进一步的比较

请注意,在第一行数据之前有一个空行

答案 1 :(得分:0)

这是一个可以帮助的骨架脚本:

cat file1 | while read line; do
  # echo "              --read $line"
  if [ "$goahead" = "yes" ]; then
    while true; do
      if [[ "$line" == \#* ]]; then
        echo "break on marker $line"
        break
      else
        echo "   process line: $line"
      fi
      read line
      # echo "  read $line"
      if [ -z "$line" ]; then break; fi
    done
  fi

  if [[ "$line" == \#* ]]; then
    echo "start on marker $line"
    goahead="yes"
  fi
done

输出与您的数据(但我的标题各不相同)是:

start on marker # Wed 06-02-2017
   process line: field1=abc
   process line: field2=xyz
   process line: field3=ijk
break on marker # Wed 07-02-2017
start on marker # Wed 07-02-2017
   process line: field1=123
   process line: field2=456
   process line: field3=789
break on marker # Wed 08-02-2017
start on marker # Wed 08-02-2017
   process line: field1=a1a
   process line: field2=c1c
   process line: field3=d1d