
次の内容を含むテストファイルがあります。
CREATE TABLE XYZ (
ABC INT,
CDE CHAR(10),
.
.
.
);
Similarly, REPLACE VIEW XYZ (
ABC,
CDE,
EFG
);
CREATE TABLE XYZ_1 (
ABC INT,
CDE CHAR(10),
.
.
.
);
Similarly, REPLACE VIEW XYZ (
ABC,
CDE,
EFG
);
これで、このテスト単一のファイルを2つのファイルに分割したいと思います。あるファイルにはill asCREATE
ステートメントが含まれ、他のファイルにはtilステートメントが含まれています。;
file1
file2
REPLACE
;
これを分割する方法を教えてください。
答え1
方法は次のとおりですsed
。
sed -n 'H # append every line to hold buffer
/CREATE\|REPLACE/h # if CREATE or REPLACE, overwrite hold buffer
/;/{ # if line matches ; then
x # exchange hold space w. pattern space
/CREATE/w file1 # if pattern space matches CREATE, write to file1
/REPLACE/w file2 # if it matches REPLACE, write it to file2
}
' infile
答え2
次のawk
スクリプトを試してください。
/CREATE/{
b="";
while (match($0, ";$")==0)
{
b=b $0"\n";
getline;
}
b=b $0;
print b > "file1";
}
/REPLACE/{
c="";
while (match($0, ";$")==0)
{
c=c $0"\n";
getline;
}
c=c $0;
print c > "file2";
}
だから
awk -f some.awk inputFile
生産する:
猫ファイル1
CREATE TABLE XYZ (
ABC INT,
CDE CHAR(10),
.
.
.
);
CREATE TABLE XYZ_1 (
ABC INT,
CDE CHAR(10),
.
.
.
);
そして
猫ファイル2
Similarly, REPLACE VIEW XYZ (
ABC,
CDE,
EFG
);
Similarly, REPLACE VIEW XYZ (
ABC,
CDE,
EFG
);
答え3
sed -e '/CREATE/,/;/s/^//w file1' -e//d <infile >file2
...ただ範囲を無効にするだけです。すべての行を書き込みます。CREATE ... ;
範囲は file1 で、他のすべての範囲は file2 です。
もっと簡単に言えば、
sed -ne '/CREATE/,/;/w file1' -e '/REPLACE/,/;/w file2' <infile
...実際の入力がサンプルデータほど単純ではない場合、重複する可能性があります。
ただし、サンプルデータを使用して2つのコマンドのいずれかを実行し、次のことを実行できます。
head -n50 file[12]
...次のような出力が生成されます。
==> file1 <==
CREATE TABLE XYZ (
ABC INT,
CDE CHAR(10),
.
.
.
);
CREATE TABLE XYZ_1 (
ABC INT,
CDE CHAR(10),
.
.
.
);
==> file2 <==
Similarly, REPLACE VIEW XYZ (
ABC,
CDE,
EFG
);
Similarly, REPLACE VIEW XYZ (
ABC,
CDE,
EFG
);