我有一个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美元字母到最后的第一个字母到反向模式中相应的1美元字母的期望输出6美元
$1 $2 $6
L A LSAGSLAAEPA
如果我正确地理解了这个问题,这个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
中的char匹配,字符串的结尾与$2
中的char匹配。无法旋转以匹配该条件的字符串保持不变,例如:
A B 3 3 - BCAAB
你可以试试这个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
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