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

时间:2017-12-27 17:11:34

标签: bash unix awk split substr

我有一个类似的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

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

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(/$2$1/,"\t",$6); print $1$7$6$2}' "input" > "output";

其他方式是:

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

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

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

$1                 $2                 $6
L                  A                  AAEPALSAGSL (reverse pattern 'AL' $2$1)

从反向模式中相应的2美元字母到结束后的第6个字母反向模式中相应的$ 1​​字母的期望输出6美元

$1                 $2                 $6
L                  A                  LSAGSLAAEPA

3 个答案:

答案 0 :(得分:5)

如果我理解正确,awk应该这样做:

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

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

A    B    3    3    -    BCAAB

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

gawk '
BEGIN{
    OFS="\t"
}
$6 !~ "^"$1".*"$2"$" {
    $6 = gensub("(.*"$2")("$1".*)", "\\2\\1", 1, $6)
}
{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