如何拆分字符串取决于其他列中的模式(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
我有一个类似这样的 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