次のファイルがあります。
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システム)の場合、このオプションは-r
GNUの場合とは異なる意味を持ちますsed
。特に\s
空白として正しく解釈されません。代わりに、以下を使用してください[[:space:]]
。
パイプの後ろの名前「xxx」が常に3つの英数字でない場合は、...
正規表現でに置き換えてください[^[:space:]]+
。一致する名前のブロックポイントは、最初に会うスペースになります。
したがって、より一般的な答えsed
は出力ファイルAに対するものです。
$ sed -r 's/[[:space:]](Cc|Bb)\|[^[:space:]]+//g' file > A