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