我需要在一个文件中提取特定的数据子集。 该文件如下所示。
n_1
@ 1 # # # # # # # # # # # # # # #
* # # # #
* # # # #
* # # # #
* # # # #
* # # # #
# # # # # # # # #
* *
* *
n_2
@ 2 # # # # # # # # # # # # # # #
* # # # #
* # # # #
* # # # #
* # # # #
# # # # # # # # #
* *
* *
n_3
.
.
.
在这里
@:某种模式
#:数字
1,2,3 ...:索引
*:字符或字符串
n_i表示每个块中@和#之间的*数量。例如,我们可以说n_1为5(在@ 1##...和####...之间),而n_2为4,因此每个块都没有固定线。
我的最终目标是提取每个测试块并将其插入到终端上的循环语句中。然后,在每个块中重新提取数据。
for i in $(extracted every block); do ...; done
在这里,我发现了另一种将每个块分离到每个文件的方法。
awk -vRS= '{print > "block" NR}' file
但是我遇到了
awk: cannot open "block1021" for output (Too many open files)
因为该文件包含超过100,000个块
答案 0 :(得分:1)
我还是解决了我的问题...
来自https://askubuntu.com/questions/1052622/separate-log-text-according-to-paragraph
“根据段落分别记录日志文字?”
awk -vRS= '{print > "paragraph" NR}' log.txt
来自Too many open files error while running awk command
“运行awk命令时打开文件过多错误”
awk '/pattern here/{close("file"i); i++}{print > "file"i}' InputFile
我将这两个命令组合在一起,
awk -vRS= '{close("block"i); i++}{print > "block"i}' file
它有效。因此,通过将每个单独的文件插入循环语句中,我可以在各个块上执行一些工作。例如,
for i in $(ls); do something; done