String 删除作为其他行的子字符串的行
如何删除文件中其他行的子字符串行,同时保留包含它们的较长字符串 我有一个包含肽序列作为字符串的文件-每行一个序列字符串。我想保留包含所有序列的字符串,并删除文件中其他行的所有行的子字符串 输入:String 删除作为其他行的子字符串的行,string,perl,awk,sed,substring,String,Perl,Awk,Sed,Substring,如何删除文件中其他行的子字符串行,同时保留包含它们的较长字符串 我有一个包含肽序列作为字符串的文件-每行一个序列字符串。我想保留包含所有序列的字符串,并删除文件中其他行的所有行的子字符串 输入: GSAAQQYW ATFYGGSDASGT GSAAQQYWTPANATFYGGSDASGT GSAAQQYWTPANATF ATFYGGSDASGT NYARTTCRRTG IVPVNYARTTCRRTGGIRFTITGHDYFDN RFTITGHDYFDN IVPVNYARTTCRRTG ARTTC
GSAAQQYW
ATFYGGSDASGT
GSAAQQYWTPANATFYGGSDASGT
GSAAQQYWTPANATF
ATFYGGSDASGT
NYARTTCRRTG
IVPVNYARTTCRRTGGIRFTITGHDYFDN
RFTITGHDYFDN
IVPVNYARTTCRRTG
ARTTCRRTGGIRFTITG
GSAAQQYWTPANATFYGGSDASGT
IVPVNYARTTCRRTGGIRFTITGHDYFDN
GSAAQQYWTPANATFYGGSDASGT
IVPVNYARTTCRRTGGIRFTITGHDYFDN
预期产出:
GSAAQQYW
ATFYGGSDASGT
GSAAQQYWTPANATFYGGSDASGT
GSAAQQYWTPANATF
ATFYGGSDASGT
NYARTTCRRTG
IVPVNYARTTCRRTGGIRFTITGHDYFDN
RFTITGHDYFDN
IVPVNYARTTCRRTG
ARTTCRRTGGIRFTITG
GSAAQQYWTPANATFYGGSDASGT
IVPVNYARTTCRRTGGIRFTITGHDYFDN
GSAAQQYWTPANATFYGGSDASGT
IVPVNYARTTCRRTGGIRFTITGHDYFDN
输出应该只保留最长的字符串,并删除作为最长字符串的子字符串的所有行。因此,在上面的输入中,第1、2、4和5行是第3行的子字符串,因此输出保留第3行。同样,对于第6、8、9和10行的字符串,它们都是第7行的子字符串,因此第7行被保留并写入输出。可能:
input=./input_file
while read -r str
do
[[ $(grep -c "$str" "$input") == 1 ]] && echo $str
done < "$input"
它很慢,但很简单。这应该可以满足您的需要:
$ cat tst.awk
{ arr[$0]; strs=strs $0 RS }
END {
for (str in arr) {
if ( split(strs,tmp,str) == 2 ) {
print str
}
}
}
$ awk -f tst.awk file
IVPVNYARTTCRRTGGIRFTITGHDYFDN
GSAAQQYWTPANATFYGGSDASGT
它循环遍历arr中的每个字符串,然后将其用作split()的分隔符值-如果该字符串出现一次,则整个文件内容将一分为二,因此split()将被拆分将返回2,但如果该字符串是其他字符串的子集,则文件内容将拆分为多个段,因此拆分将返回大于2的数字
如果一个字符串可以在输入中出现多次,并且您希望它在输出中打印多次(请参见下面@G.Cito的注释中的问题),那么您应该将上述内容修改为:
!cnt[$0]++ { strs=strs $0 RS }
END {
for (str in cnt) {
if ( split(strs,tmp,str) == 2 ) {
for (i=1;i<=cnt[str];i++) {
print str
}
}
}
}
!cnt[$0]+{strs=strs$0}
结束{
用于(cnt中的str){
if(拆分(str、tmp、str)==2){
对于(i=1;i这将帮助您满足您的确切需求:
awk'{print length(),NR,$0 |“sort-rn”}将_longer.txt | head-n2作为perl“一行程序”(这应该可以用于剪切和粘贴到终端中):
输出:
GSAAQQYW
ATFYGGSDASGT
GSAAQQYWTPANATFYGGSDASGT
GSAAQQYWTPANATF
ATFYGGSDASGT
NYARTTCRRTG
IVPVNYARTTCRRTGGIRFTITGHDYFDN
RFTITGHDYFDN
IVPVNYARTTCRRTG
ARTTCRRTGGIRFTITG
GSAAQQYWTPANATFYGGSDASGT
IVPVNYARTTCRRTGGIRFTITGHDYFDN
GSAAQQYWTPANATFYGGSDASGT
IVPVNYARTTCRRTGGIRFTITGHDYFDN
“长”是什么?“两个最长的”?啊,你想删除另一个字符串的子字符串吗?到目前为止你尝试了什么?是的,我指的是两个最长的字符串。很抱歉混淆。我只是编辑了一下,想弄清楚。希望现在能弄清楚。另外,由于这些是肽序列,我转换成fasta文件,并使用CD-HIT程序,将类似的序列100%进行聚类标识并生成输出。稍后,将该fasta转换为文本文件进行进一步分析。我在bottom@EdMorton因此,在文件
中的所有字符串中,awk
只查找并打印那些可以一分为二的字符串(跳过那些不能被分割或分割多次的字符串).++很好,很简单!有没有一种简单的方法来处理“long”字符串(我在下面更巴洛克的perl解决方案中称之为“master string”)的情况多次发生?使用awk
脚本和perl%uniq
散列,它将从输出中删除。如果要求只打印一次,则只需将第一行更改为!arr[$0]+{strs=strs$0}
(习惯上,在该上下文中使用时,arr
将被命名为seen
或count
),因此它只在以后拆分的strs字符串中出现一次。如果要求打印它的次数与它在输入中出现的次数相同,那么您还需要将print str
更改为(i=1;i)