如何拆分字符串取决于其他列中的模式(UNIX 环境)

How to split a string depends on a pattern in other column (UNIX environment)

我有一个类似这样的 TAB 文件:

V    I      280     6   -   VRSSAI
N    V      2739    7   -   SAVNATA
A    R      203     5   -   AEERR
Q    A      2517    7   -   AQSTPSP
S    S      1012    5   -   GGGSS
L    A      281    11   -   AAEPALSAGSL

我想检查最后一列与第一列和第二列中字母顺序的关系。如果与第一列和第二列相比,最后一列中的第一个和最后一个字母分别保持相同。相反,如果没有巧合,我想在最后一列中找到倒序模式,然后打印从第一列中的字母到最后的字符串,然后取第一个字母并打印到第二列中的字母。所需的输出将是:

V    I      280     6   -   VRSSAI
N    V      2739    7   -   NATASAV
A    R      203     5   -   AEERR
Q    A      2517    7   -   QSTPSPA
S    S      1012    5   -   SGGGS
L    A      281    11   -   LSAGSLAAEPA

通过这种方式,我尝试执行不同的脚本,但无法正常工作,我不知道具体原因。

awk 'BEGIN {FS=OFS="\t"}{gsub(//,"\t",); print }' "input" > "output";

其他方式是:

awk 'BEGIN {FS=OFS="\t"} {len=split(,arrseq,""); for(i=0;i<len;i++){printf "%s ",arrseq[i],arrseq[i+1]}' `"input" > "output";`

我也尝试使用 substr 函数,但最终没有人正常工作。可以在 bash 中完成吗?提前致谢

我试着举个例子来更好地理解这个问题。

                                  
L                  A                  AAEPALSAGSL (reverse pattern 'AL' )

$6 中的所需输出从反向模式中对应的 $2 字母到反向模式中第一个字母到对应的 $1 字母的末尾

                                  
L                  A                  LSAGSLAAEPA

你可以试试这个 awk,它并不完美,但它给了你一个起点。

awk '{i=(match(,));if(i==1)print;else{a=;b=substr(a,i);c=substr(a,1,(i-1));=b c;print}}' OFS='\t' infile

如果我对问题的理解正确,awk 应该这样做:

awk '( substr(, 1, 1) !=  || substr(, length(), 1) !=  ) && i = index(, ) {  = substr(, i+1) substr(, 1, i)  }1' OFS=$'\t' data

您基本上想要旋转字符串,以便字符串的开头与 </code> 中的字符匹配,字符串的结尾与 <code> 中的字符匹配。无法旋转以匹配该条件的字符串保持不变,例如:

A    B    3    3    -    BCAAB
gawk '
BEGIN{
    OFS="\t"
}
 !~ "^"".*""$" {
     = gensub("(.*"")("".*)", "\2\1", 1, )
}
{print}
' input.txt

输出

V   I   280     6   -   VRSSAI
N   V   2739    7   -   NATASAV
A   R   203     5   -   AEERR
Q   A   2517    7   -   QSTPSPA
S   S   1012    5   -   SGGGS
L   A   281     11  -   LSAGSLAAEPA