web-dev-qa-db-ja.com

csplitで区切り文字を除外する

Csplitで区切り文字を削除することは可能ですか?例:

$ cat in
abc
---
def
---
ghi
$ csplit -q in /-/ '{*}'
$ ls x*
xx00  xx01  xx02
$ head xx*
==> xx00 <==
abc

==> xx01 <==
---
def

==> xx02 <==
---
ghi

それが行ったこと、つまり区切り文字を分割して保持する代わりに、区切り文字を分割して削除するように要求できますか?

つまり、必要な出力は次のようになります。

$ sed -i '/-/d' xx*
$ head xx*
==> xx00 <==
abc

==> xx01 <==
def

==> xx02 <==
ghi

上記のように2つのステップで実行できますが、1つのステップで実行できますか?

Csplitで実行できない場合、上記の2つの呼び出し(csplit + sed)と比較して短いワンステップの方法はありますか?適度に読みやすい限り、使用されるツールを優先することはありません。

6
levant pied

正規表現の一致ではなく文字列の一致で間に合わせることができる場合

awk 'BEGIN {RS="---\n"; ORS=""} {print > sprintf("xx%02d", NR)}' in

GNU awk(少なくともv4.0.1では))を使用すると、isRSに正規表現を使用できます。

gawk 'BEGIN {RS="-+\n"; ORS=""} {print > sprintf("xx%02d", NR)}' in
2
steeldriver

gnu csplitを使用しているように見えるので、非常に簡単です。

csplit --suppress-matched infile /PATTERN/ '{*}'

つまり、--suppress-matchedを使用して、PATTERNに一致する行を抑制します。


ご注意ください。このオプションは、csplitの最新バージョン(coreutils≥8.22)でのみ使用できます。

5
don_crissti
Perl -ne 'BEGIN { $fnum=0; open $fh, ">", sprintf "xx%02d", $fnum++ } if (m/-/) { open $fh, ">", sprintf "xx%02d", $fnum++ } else { print $fh $_ }' inputfileorfileshere

または、awkなどを介した同様のreopen-into-new-file-on-matching-appropriate-line。

2
thrig