Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 删除作为其他行的子字符串的行_String_Perl_Awk_Sed_Substring - Fatal编程技术网

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)