我对grep有个问题。
我有一个名为Uniprot_interactors.txt的文件,其中包含一个代码列表(例如。GRT986E),有时在对象之间有一个或多个空行。
在其他一些情况下,我有一个对象,由两个部分组成,被一个低破折号分割(例如。TRY546 _ TRE578),而这些行必须被视为空行。
在此之后,我有另一个文件Good_interactors.txt,它包含一个代码列表,每个人都有一个变量(es )。aaaaaa)是相关联的。我想从这些文件的output.txt中获得一个输出( grep ),但是我希望像在第一个文件中一样保持行为空。
举个例子:
UNIPROT_interactors.txt QR846OI PO3R56 UJ6Y68 YU654R PL92WS GH654Y _ HUY765R PIHYUDGOOD_Interactors.txt TYRT68Y aaaaaaaaa QR846OI bbbbbbbbb FDR59I cccccccc PO3R56 ddddddd UJ6Y68 eeeeeee VFR6y7 fffffff gggggggg UH7609 hhhhhhhhoutput.txt (文件1的相同格式) QR846OI bbbbbbbbb PO3R56 ddddddd UJ6Y68 eeeeeee YU654R PL92WS GH654Y _ HUY765R PIHYUD我试着使用这段代码:
grep -f Uniprot_interactors.txt GOOD_interactors.txt > output.txt但是文件1的格式未被保留,空行已被删除。
发布于 2020-06-16 14:03:30
您不能在这里使用grep,因为grep的目的是提取匹配特定正则表达式的行(在某些情况下是单词)。grep实用程序不修改数据,这就是您想要做的事情(将数据添加到从一个文件到另一个文件的行)。
使用awk在以Uniprot标识符为键的关联数组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命令的输入。在读取第一个文件时,只会触发具有FNR==NR条件的块,而在读取第二个文件时将跳过该块。
特殊变量FNR、NR和NF分别是从当前文件中读取的记录数(行)、在所有文件中读取的记录数以及当前记录中的字段数(列)。
发布于 2020-06-16 13:59:46
在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.txthttps://unix.stackexchange.com/questions/593227
复制相似问题