タブで区切られたテーブルから重複文字列を含む行のみを抽出する

タブで区切られたテーブルから重複文字列を含む行のみを抽出する

10個のタブで区切られた列を持つ長いデータのリストがあります。最初の2つの列はIDです。選択したIDを持つ行を検索したいです。

まず、各IDがで終わるように選択したIDの名前を変更しますcomp-。次に、選択したIDが列1と列2の両方の行を抽出しようとします。

文書:

comp-AA11232.1  GR55896.1
AB55887.1   comp-FR87559.1
comp-AC11232.1  comp-AE55888.1
comp-AC66742.1  comp-AD87559.1

希望の出力:

comp-AC11232.1    comp-AE55888.1
comp-AC66742.1    comp-AD87559.1

を使用していますsed -n '/comp\-.*\tcomp\-.*/p' file。出力ファイルは基準を満たすすべてのファイルですが、残念ながら、同じ基準の一部の行が出力ファイルにありません。

ここで何が起こっているのか分かりません。どんなアイデアがありますか?それともこの状況でより良いgrep / awk / sedアプローチがありますか?

答え1

awk -F'\t' '$1 ~/^comp-/ && $2 ~/^comp-/' infile

同じですが、パラメータからパターンを渡します。

awk -F'\t' -v pat='comp-' '$1 ~"^" pat && $2 ~"^" pat' infile

または、文字列一致で比較し、引き続きパラメータから渡します。

awk -F'\t' -v str='comp-' 'index($1, str)==1 && index($2, str)==1' infile

また、見ることができますパターンに一致するテキストを見つける方法は?追加のマッチングオプションを確認してください。

答え2

真珠

perl -MList::MoreUtils=all -F'\t' -lane '
  print if all { /^comp-/ } @F[0,1];
' file

sedGNUバージョン

$ sed -n '/^comp-.*\tcomp-/p' file

関連情報