2 个文件之间的 grep 并保留文件 1 的空行

2 个文件之间的 grep 并保留文件 1 的空行

我有一个问题grep

我有一个名为Uniprot_interactors.txt包含代码列表(例如GRT986E)的文件,有时在对象之间有一个或多个空行。

在其他一些情况下,我有一个由两部分组成的对象,这些部分被短破折号(例如TRY546 _ TRE578)分开,并且这些行必须被视为空。

之后,我有另一个Good_interactors.txt包含代码列表的文件,并且每个人都有一个关联的变量(es. 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实用程序不会修改数据,而这正是您想要做的(将数据添加到从一个文件到另一个文件的行)。


用于awk将好的交互器保存在关联数组 中,names并以 Uniprot 标识符作为键。然后根据第一列中的 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命令的输入。从第一个文件读取时,FNR==NR只会触发符合条件的块,而从第二个文件读取时,将跳过该块。

特殊变量FNRNRNF是从读取的记录(行)数当前的分别是文件中读取的记录数和当前记录中的字段(列)数。

答案2

循环读取 file1 行 ifempty echo it else 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

相关内容