我有一个包含一些数据的大文本文件,如下所示:
$ 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
和......
答案 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作为数组而不是多行字符串,如果这样更方便,但逻辑相同。