列の内容に応じてテキストファイルを複数のファイルに分割する

列の内容に応じてテキストファイルを複数のファイルに分割する

次のファイルがあります。

1 : Aa|xxx Aa|xxx Bb|xxx Cc|xxx Cc|xxx Cc|xxx 
2 : Cc|xxx Aa|xxx Aa|xxx Aa|xxx Bb|xxx    
3 : Bb|xxx Bb|xxx Aa|xxx Cc|xxx    
4 : Bb|xxx Aa|xxx Cc|xxx    
5 : Aa|xxx Cc|xxx Bb|xxx 

名前などのxxx別々のコードを表します。Aa各行には常に3つの名前があります。

行番号(最初の列)と名前のみを含む3つのファイルが必要です。このような:

1 : Aa|xxx Aa|xxx
2 : Aa|xxx Aa|xxx Aa|xxx
3 : Aa|xxx
4 : Aa|xxx
5 : Aa|xxx

誰でもこの問題を解決するのに役立ちますか?とても嬉しかったです。よろしくお願いします!

答え1

1つの可能な方法は、重複したコンテンツを削除することです。

perl -pe 's/ (Bb|Cc)\S*//g' file > A
perl -pe 's/ (Aa|Cc)\S*//g' file > B
perl -pe 's/ (Aa|Bb)\S*//g' file > C

(一部はsed、awkなどで行うことができます)

答え2

sed@JJaoが指摘したように、拡張正規表現()を使用するのも簡単です-r

$ sed -r 's/\s(Cc|Bb)\|...//g' file > A
$ sed -r 's/\s(Aa|Cc)\|...//g' file > B
$ sed -r 's/\s(Aa|Bb)\|...//g' file > C

Os X(Appleシステム)の場合、このオプションは-rGNUの場合とは異なる意味を持ちますsed。特に\s空白として正しく解釈されません。代わりに、以下を使用してください[[:space:]]

パイプの後ろの名前「xxx」が常に3つの英数字でない場合は、...正規表現でに置き換えてください[^[:space:]]+。一致する名前のブロックポイントは、最初に会うスペースになります。

したがって、より一般的な答えsedは出力ファイルAに対するものです。

$  sed -r 's/[[:space:]](Cc|Bb)\|[^[:space:]]+//g' file > A

関連情報