首页 > 解决方案 > 需要读取文件并在两个空行之间抓取每个文本块

问题描述

需要可以获取每两行并存储在变量中的while循环。

while read data; do
   echo $data
done

所以我需要为每个文本块做一些事情,每个文本块是两行。

标签: bashwhile-loopscripting

解决方案


知道您想对这两行做什么会有所帮助,但是您可以使用 很容易地收集每个由空行包围的 2 块awk,例如

awk '
    NF==0 { n=0; next } 
    n<2   { arr[++n]=$0 } 
    n==2  { printf "do to: %s & %s\n",arr[1],arr[2]; n=0 }
' file

或作为 1-liner:

awk 'NF==0{n=0;next} n<2{arr[++n]=$0} n==2{printf "do to: %s & %s\n",arr[1],arr[2]; n=0}' file

如果您有 3 条规则,则第一个规则检查该行是否为空NF==0,如果是,则将索引n设置为零并跳到next记录(行)。第二个检查是n<2将当前行添加到数组arr中。最终规则是对anen==2中包含的行执行任何您需要的操作,然后将索引重置为零。arr[1]arr[2]n

示例输入文件

无耻地从另一个答案中借用并修改(谢谢),您可以:

$ cat file

some text here
some text here a

some text here 2
some text here 2a

示例使用/输出

收集由空格分隔的每 2 行,然后以"do to: "前缀输出,行由 连接" & ",仅用于示例目的:

$ awk 'NF==0{n=0;next} n<2{arr[++n]=$0} n==2{printf "do to: %s & %s\n",arr[1],arr[2]; n=0}' file
do to: some text here & some text here a
do to: some text here 2 & some text here 2a

根据您需要对线路做什么,awk可能会提供一个非常有效的解决方案。(可能sed


推荐阅读