使用sed以“$”开头的两行之间的行提取

时间:2017-01-07 10:11:46

标签: bash sed

我有一个包含一些数据的大文本文件,如下所示:

$  10c20
data
data
.
.
data
data
$  10c21
data
data
.
.
data
data
$  10c22
.
.

我想在每两条注释行之间提取数据(以“$”开头)并将该数据块存储在新文件中,然后将下一个块存储到文件末尾。我试过“sed”,但我无法获得我需要的东西。任何想法?

期望的输出:

$  10c20
    data
    data
    .
    .
    data
    data

$  10c21
    data
    data
    .
    .
    data
    data 

$  10c22
    data
    data
    .
    .
    data
    data 

和......

3 个答案:

答案 0 :(得分:1)

如果你不想要一个更高的'像Python / Perl这样的语言是一个常见的内置csplit,但您需要同意使用文件:

/home/.../RGS/tmp>csplit bla  '/^\$/' {*} 
0
21
21
21
21
/home/.../RGS/tmp>cat xx00
/home/.../RGS/tmp>cat xx01
$  10c20
data1
data1
/home/.../RGS/tmp>cat xx02
$  10c21
data2
data2
/home/.../RGS/tmp>cat xx03
$  10c22
data3
data3
/home/.../RGS/tmp>cat xx04
$  10c23
data4
data4
/home/.../RGS/tmp>

bla是:

$  10c20
data1
data1
$  10c21
data2
data2
$  10c22
data3
data3
$  10c23
data4
data4

最后只有rm xx*

修改

文件准备好后,只需使用bash:

for inp in xx*; do
     cat $inp | toSomeComputations &
     #Or
     toSomeComputations $inp &
 done

当然,您可以使用其他东西来使这个循环并行。

答案 1 :(得分:0)

这是一个 GNU awk脚本,它重现了@kabanus的答案。当@kabanus给出的答案不适合你时,我不知道这对你有什么帮助,但现在就是这样。

<强> script.awk

function doit( header ) { 
    # filename with leading zeros in number
    outFileName = sprintf("out_%04d", NR-1)
    printf("%s%s", header, $0 ) > outFileName
    # now lets run a command on that file, e.g. cat
    system("cat " outFileName )
}

# set record split by the dollar lines
BEGIN   { RS="[$][^\n]+" }

{ 
  # on NR == 1 ( the first record ) oldRT is empty
  # we need to store RT and use oldRT when we output $0 
  # for the next record
  if( oldRT ) doit( oldRT )
  oldRT = RT
}

运行方式如下:awk -f script.awk yourfile

答案 2 :(得分:0)

您只需要:

novalidate

你可以将buf作为数组而不是多行字符串,如果这样更方便,但逻辑相同。