我有一个包含以下示例文本的文件:
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
提供的第一行ed
ed -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);