从文件中分隔多个部分/行

从文件中分隔多个部分/行

我有一个包含以下示例文本的文件:

THIS(
is first
Line);
THAT(
is second line);
THIS(
is third
line);
THAT(
is 
fourth
line);

如果您看到该文件,每个部分都以“THIS”或“THAT”开头,并且每个文本部分都以分号 ( ) 结尾;。我想要一个 Unix 命令/脚本,它将搜索“THIS”和“THAT”并将所有“THIS”部分复制到一个文件first_file,并将所有“THAT”部分复制到另一个文件second_file

示例:第一个文件应包含:

THIS(
is first
Line);
THIS(
is third
line);

第二个文件应包含:

THAT(
is second line);
THAT(
is 
fourth
line);

答案1

给定

$ cat thisthat 
THIS(
is first
Line);
THAT(
is second line);
THIS(
is third
line);
THAT(
is 
fourth
line);

然后

awk -vRS=';\n' 'BEGIN{ORS=RS} /^THIS/ {print > "these"} /^THAT/ {print > "those"}' thisthat

结果

$ head these those 
==> these <==
THIS(
is first
Line);
THIS(
is third
line);

==> those <==
THAT(
is second line);
THAT(
is 
fourth
line);

答案2

对于任何 awk:

$ awk -v RS=';' 'NF{sub(/^\n/,""); print > (/^THIS/ ? "first_file" : "second_file")}' file

$ cat first_file
THIS(
is first
Line)
THIS(
is third
line)

$ cat second_file
THAT(
is second line)
THAT(
is
fourth
line)

或使用 GNU awk 实现多字符 RS 和 RT:

$ awk -v RS='(THIS|THAT)[^;]+;\n' -v ORS= '{$0=RT; print > (/^THIS/ ? "first_file" : "second_file")}' file

$ cat first_file
THIS(
is first
Line);
THIS(
is third
line);

$ cat second_file
THAT(
is second line);
THAT(
is
fourth
line);

两种解决方案都假设您的示例是准确的,并且;除了在块的末尾(例如不在部件内(...))之外,您永远不会有 s 。

答案3

使用ed文件编辑器,但需要事先创建第二个(空)文件。原始文件file1在此示例中命名。

创建第二个文件名为file2

> file2

定理

ed -s file1 << 'EOF'
H
g/^THAT($/;/^.*\;$/d
w
u
g/^THIS($/;/^.*\;$/d
0r file2
w file2
EOF

使用heredocfile1提供的第一行eded -s file1 << 'EOF'

第二行打印对错误有用的更详细消息。H

第三行 删除以 THAT( 开头的行,直到以 ; 结尾的行

g/^THAT($/;/^.*\;$/d

第四行 将更改写入 file1w

第五行 仅撤消缓冲区中的更改,而不是 file1 中的更改。u

第六行 删除以 THIS( 开头的行,直到以 ; 结尾的行

g/^THIS($/;/^.*\;$/d

第七行 将缓冲区中剩余的文本添加到 file2 的开头

0r file2

八行写入更改文件2。w file2


唯一的班轮。

>file2; printf '%s\n' H 'g/^THAT($/;/^.*\;$/d' w u 'g/^THIS($/;/^.*\;$/d' '0r file2' 'w file2' | ed -s file1

请注意,ed编辑文件in-place意味着文件将被直接编辑,并且不会将输出打印到其他地方,因此ed在生产文件中运行之前首先使用一些示例对其进行测试。

答案4

尝试使用 Awk Flag 方法

awk '/THIS/{f=1}/THAT/{f=0}f' file > file1(Contains "THIS" PATTERN)
awk '/THAT/{f=1}/THIS/{f=0}f' file > file2(Contains "THAT" PATTERN)

输出

cat file1

THIS(
is first
Line);
THIS(
is third
line);



cat file2

    THAT(
    is second line);
    THAT(
    is 
    fourth
    line);

相关内容