如何提取每个文本块并将其放入循环语句

时间:2019-05-03 03:00:10

标签: bash for-loop awk grep

我需要在一个文件中提取特定的数据子集。 该文件如下所示。

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个块

1 个答案:

答案 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