我有一个问题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
只会触发符合条件的块,而从第二个文件读取时,将跳过该块。
特殊变量FNR
、NR
和NF
是从读取的记录(行)数当前的分别是文件中读取的记录数和当前记录中的字段(列)数。
答案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