删除特定字符并在单独的行中打印

删除特定字符并在单独的行中打印

我需要您的紧急帮助和指导,我有一个文件,其中有 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用换行符替换所有一个或多个KR和空格/制表符A.txt

awk

awk -F '[KR[:blank:]]+' '{for(i=1; i<=NF; i++) print $i}' A.txt
  • -F '[KR[:blank:]]+'将字段分隔符设置为一个或多个KR、空格/制表符

  • {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

KR和空格字符替换为换行符,压缩任何多个实例:

$ tr -s '[KR[:space:]]' '\n' < file
MSTNP
PQ
T
NTN
PE
DV
FPGGQI

相关内容