質問がありますgrep
。
場合によっては、オブジェクト間に1つ以上の空白行を含むUniprot_interactors.txt
コードのリスト(たとえば)を含むファイルがあります。GRT986E
他の場合には、TRY546 _ TRE578
ダッシュ(たとえば)で区切られた2つの部分からなるオブジェクトがあり、線は空であると見なされるべきです。
Good_interactors.txt
次に、コードリストを含む別のファイルがあり、各ファイルには関連変数(たとえばaaaaaa
)があります。output.txt
このファイルから出力()を取得したいのですが、grep
最初のファイルのように行を空白にしたいと思います。
一例:
ファイル1:
UNIPROT_interactors.txt
QR846OI PO3R56 UJ6Y68 YU654R PL92WS GH654Y _ HUY765R PIHYUD
ファイル2:
GOOD_Interactors.txt
TYRT68Y aaaaaaaaa QR846OI bbbbbbbbb FDR59I cccccccc PO3R56 ddddddd UJ6Y68 eeeeeee VFR6y7 fffffff PIHYUD gggggggg UH7609 hhhhhhhh
ファイル
output.txt
(ファイル1と同じ形式)QR846OI bbbbbbbbb PO3R56 ddddddd UJ6Y68 eeeeeee YU654R PL92WS GH654Y _ HUY765R PIHYUD gggggggg
このコードを試してみてください。
grep -f Uniprot_interactors.txt GOOD_interactors.txt > output.txt
ただし、ファイル1の形式は保持されず、空行が削除されました。
答え1
特定の正規表現に一致する行(または場合によっては単語)を抽出することがgrep
目的であるため、ここでは使用できません。grep
このgrep
ユーティリティは、ユーザーが望むようにデータを変更しません(あるファイルから別のファイルに行にデータを追加します)。
Uniprot識別子でキーを付けたawk
連想配列に良いインタラクティブを格納するために使用されます。names
次に、最初の列のUniprot識別子に基づいてこれらの対話子を出力します(複数の列があるか、既知の良好な対話者が変更されていない行を渡している間)。
$ awk 'FNR==NR { names[$1] = $0; next } NF > 1 || !($1 in names) { print; next } { print names[$1] }' GOOD_Interactors.txt UNIPROT_interactors.txt
QR846OI bbbbbbbbb
PO3R56 ddddddd
UJ6Y68 eeeeeee
YU654R
PL92WS
GH654Y _ HUY765R
PIHYUD gggggggg
awk
これら2つのファイルをコマンドへの入力として使用していることに注意してください。最初のファイルを読み取るときはFNR==NR
基準を満たすブロックだけがトリガされ、2番目のファイルを読み取るときはそのブロックをスキップします。
特殊変数FNR
、NR
およびNF
は読み取られたレコード(行)の数です。現在のファイルから読み取られたレコード数と現在のレコードのフィールド(列)数。
答え2
空の場合はfile1行を繰り返し、それ以外の場合はそのデータをgrepして印刷します。
while read line ; do
if ((${#line}));then
grep "${line}" file2
else
echo
fi
done < file1 > output.txt
または
file2content="$(cat file2)";
while read line ; do
if ((${#line}));then
grep "${line}" <<< "${file2content}"
else
echo
fi
done < file1 > output.txt