使用 shell 脚本根据行文本将 .txt 文件拆分为 3 个文件

使用 shell 脚本根据行文本将 .txt 文件拆分为 3 个文件

我有一个要求,我要从某个工具的输出中获取 .txt 文件,并且我想将其分成三个。

文件中的示例文本:

First line
Second line
23456
45677
45678

Third line
90909
90678

Last line
Z567Z
6787T

预期产出:

-> 文件1.txt

23456
45677
45678

-> 文件2.txt

90909
90678

-> 文件3.txt

Z567Z
5677T

基本上,文件将具有我们想要使用的 5 位数字/字母数字值,其间的文本用作将文件拆分为多个文件的标识符。

我正在寻找使用awksed命令来执行此操作。

答案1

如果这不是您所需要的:

$ awk '
    /^[[:alnum:]]{5}$/ {
        if ( !inBlock++ ) {
            close(out)
            out = "file" (++cnt) ".txt"
        }
        print > out
        next
    }
    { inBlock = 0 }
' file

$ head file?.txt
==> file1.txt <==
23456
45677
45678

==> file2.txt <==
90909
90678

==> file3.txt <==
Z567Z
6787T

然后编辑您的问题以提供更清晰的要求和更具代表性的示例输入/输出。

答案2

这是丑陋的一行:

grep -v '[:alpha:]' test.txt | sed "s/^$/==/g" | split -p "=="

注意:这将根据“==”模式生成 3 个或更多文件 (xa*)。

您可以进一步使用 for 循环删除“==”(sed 's/=//g' xa* | grep -v "^$")(如果有)。

答案3

您可以使用 GNU 工具箱中的 grep+csplit

grep -v '\W' < your_file |
csplit --suppress-matched \
  -szn1 -f file -b '%d.txt' \
  - '/^$/' '{*}'

awk 处于段落模式,其中记录至少由一个空行分隔。

awk -v RS= '
match($0,/\n[[:alnum:]]+(\n|$)/) {
  out = "file" NR ".txt"
  print substr($0,1+RSTART) > out
  close(out)
}
' your_file

使用 GNU sed,我们首先从输入数据生成 sed 代码,然后对其进行操作以生成所需的输出文件。

sed -En '
  1{x;s/.*/123/;x;}
  /^\w+$/{=;$z;}
  /^$/{
    G
    s/^(.)(.)(.*)/wfile\2.txt\1\3/
    P;s/.*\n//;h
  }
' your_file | sed -Ee '
  :a;N;/\n[0-9]+$/ba
  s/\n(.*\n)?([0-9])/,\2/
  s/\n//
' - | sed -nf - your_file

输出文件:如果是 csplit,文件编号从零开始。

==> file1.txt <==
23456
45677
45678

==> file2.txt <==
90909
90678

==> file3.txt <==
Z567Z
6787T

相关内容