2つのファイルの間をgrepし、ファイル1の空白行を保持します。

2つのファイルの間をgrepし、ファイル1の空白行を保持します。

質問があります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番目のファイルを読み取るときはそのブロックをスキップします。

特殊変数FNRNRおよび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

関連情報