ファイルから複数のセクション/行を分割します。

ファイルから複数のセクション/行を分割します。

次のサンプルテキストを含むファイルがあります。

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

ファイルを見ると、各セクションは「THIS」または「THAT」で始まり、各テキストセクションはセミコロン()で終わります;。私は「THIS」と「THAT」を検索し、すべての「THIS」部分を1つのファイルにコピーし、すべてのfirst_file「THAT」部分を別のファイルにコピーするUnixコマンド/スクリプトが必要ですsecond_file

例: 最初のファイルには以下を含める必要があります。

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

2番目のファイルには、次のものを含める必要があります。

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 -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ファイルエディタを使用しますが、最初に2番目の(空の)ファイルを作成します。file1この例では、ソースファイルの名前が指定されています。

という名前の2番目のファイルを作成します。file2

> file2

整理

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

file1heredocが提供する最初の行を使用してください。eded -s file1 << 'EOF'

2行目は、エラーに役立つ詳細なメッセージを表示します。H

3行目はTHAT(で始まる行を;で終わる行まで削除します)。

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

4行目は変更をfile1に書き込みます。w

5行目は、file1以外のバッファへの変更のみをキャンセルします。u

6行目はTHIS(で始まる行を;で終わる行まで削除します)。

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

行7では、バッファに残っているテキストをfile2の先頭に追加します。

0r file2

ファイル2を変更するために8行が記録されます。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フラグ方式を試してください

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);

関連情報