段落に「7-04/PNLP-000001」形式のコードが含まれるたびに、テキストファイルを別のファイルに分割するようにgawkを試しています。たとえば、元のテキストファイルに次の内容が含まれているとします。
Seville-Córdoba-Madrid Avenueに関連するProposición no de Ley 7-04/PNLP-000009。アンダルシア農村地域中年労働者のリハビリテーションと社会の発展に関するLey
大統領夫人の提案7-04 / PNLP-000001。大統領の妻
以下を含むファイルを取得したいと思います。
Seville-Córdoba-Madrid Avenueに関連するProposición no de Ley 7-04/PNLP-000009。
大統領の妻
別の内容は次のとおりです。
Ley 7-04/PNLP-000001 アンダルシアの田舎地域の中年労働者のリハビリテーションと社会の発展に関する提案。
大統領の妻
このコードを使用して実行しようとしています。
gawk '
/^\n.+[0-9]\-[0-9]{2}\/.+\-[0-9]{6}$/
{if (p) close (p)
p = sprintf("split%05i.txt", ++i) }
{ print > p; }
' input.txt
ただし、これはコンテンツに関係なく、1行に1つのファイルのみを生成します。私が間違っていることを知っている人はいますか?よろしくお願いします!
答え1
ほぼ完了しました:
awk '/[0-9]-[0-9]{2}\/[[:upper:]]+-[0-9]{6}/ {
if (file) close (file)
file = sprintf("split%05i.txt", ++i)
}
file {print > file}' input.txt
パターンに一致する{ if... }
行に対してコードブロックを実行しようとしているので。[0-9]...
/.../
2番目のコードブロックは{print > file}
すべてのレコードセットに対して実行され、条件として使用されます。file
file
ここでパターンは、順番に処理される各レコードが各行の内容なので(基本レコード区切り記号()はです)、レコードに改行文字が含まれないため\n
意味がありません。また、ここに正規表現を固定したくありません(および)。awk
RS
\n
^
$
.+
より具体的に説明するためにあなたのものを置き換えました[[:upper:]]+
。たとえば、の場合.+
と一致しますblah 5-10/2 blah blah €1000000
。受け入れたいものに応じて調整が必要な場合がありますPNLP
。
また、パターンに一致する文字列が含まれているため、一致することに注意してください(太字で表示)。blah 1234-56/XX-1234567890 blah
コードが具体的ではないため、g
inを削除しました。ただし、上記の/演算子をサポートしていないいくつかのawk実装がまだあることに注意してください(POSIX要件にもかかわらず)。それが利用可能であることを知っている場合は、それを使用して機能していることを確認することをお勧めします。gawk
gawk
{2}
{6}
gawk
答え2
私はそうします:perl -ne 'my $fh="/dev/stdout"; if(/7-04\/PNLP-(\d+)/) { close $fh; open($fh,">/path/to/outputfiles/file$1"); } ; print $fh $_;' < /path/to/inputfile