我需要您的紧急帮助和指导,我有一个文件,其中有 1000 个序列,我想从中分离 K 和 R 并逐行粘贴剩余的序列。文件 A:
MSTNPKPQRK TKRNTNRRPE DVKFPGGQI
期望输出:
MSTNP
PQ
T
NTN
PE
DV
FPGGQI
得到这个输出后,我想在文件 B(序列数据库)中搜索单个序列
答案1
和sed
:
sed 's/[KR[:blank:]]\+/\n/g' A.txt
sed 's/[KR[:blank:]]\+/\n/g' A.txt
用换行符替换所有一个或多个K
、R
和空格/制表符A.txt
和awk
:
awk -F '[KR[:blank:]]+' '{for(i=1; i<=NF; i++) print $i}' A.txt
-F '[KR[:blank:]]+'
将字段分隔符设置为一个或多个K
、R
、空格/制表符{for(i=1; i<=NF; i++) print $i}
迭代并打印字段
您可以awk
使用这两个文件作为参数来在另一个文件上搜索结果模式,然后从那里开始工作。
更通用的方法是grep
从输入文件名中获取模式,您可以使用进程替换来获取文件描述符:
grep -f <(awk/sed ... A.txt) B.txt
对于精确匹配,添加-F
:
grep -Ff <(awk/sed ... A.txt) B.txt
例子:
% cat A.txt
MSTNPKPQRK TKRNTNRRPE DVKFPGGQI
% sed 's/[KR[:blank:]]\+/\n/g' A.txt
MSTNP
PQ
T
NTN
PE
DV
FPGGQI
% awk -F '[KR[:blank:]]+' '{for(i=1; i<=NF; i++) print $i}' A.txt
MSTNP
PQ
T
NTN
PE
DV
FPGGQI
答案2
可以通过多种不同的方式获得所需的输出。下面介绍的 Perl 和 Awk 的工作方式完全相同。您可以使用>
运算符将任一命令重定向到文件,然后使用grep -f pattern.txt data.txt
例如,使用下面介绍的 perl,我们可以执行以下操作:
perl -ne '@s=split /[KR ]/,$_; foreach(@s){ print "$_\n" if !/^$/}' input.txt > pattern.txt && grep -f pattern.txt data.txt
Perl
perl 方法实际上与下面解释的 AWK 相同:使用 K、R 和空格作为分隔符将行拆分为列,然后对它们进行迭代,仅打印非空列。
$ perl -ne '@s=split /[KR ]/,$_; foreach(@s){ print "$_\n" if !/^$/}' input.txt
MSTNP
PQ
T
NTN
PE
DV
FPGGQI
大王
$ awk -F '[KR ]' 'BEGIN{OFS="\n"};{$1=$1;print}' input.txt | awk '!/^$/'
MSTNP
PQ
T
NTN
PE
DV
FPGGQI
其工作原理的关键点:
-F
允许我们使用空格、K 和 R 作为列(又名字段)的分隔符。BEGIN{OFS="\n"}
允许我们使用换行符作为输出分隔符,以便项目以换行符分隔- 为了应用新的 OFS,我们通过
$1=$1
分配触发文本行的重建,并最终打印该行。 - 由于多个列分隔符 K、R 和空格相邻(例如
PQRK
),我们必须从第一个 awk 中过滤掉空行,这正是第二个 awk 正在做的事情。
答案3
将K
、R
和空格字符替换为换行符,压缩任何多个实例:
$ tr -s '[KR[:space:]]' '\n' < file
MSTNP
PQ
T
NTN
PE
DV
FPGGQI