R语言 替换列中的字母以生成新列[已关闭]

xqkwcwgp  于 2023-07-31  发布在  其他
关注(0)|答案(1)|浏览(81)

已关闭,此问题需要更focused。它目前不接受答复。
**想改善这个问题吗?**更新问题,使其仅通过editing this post关注一个问题。

去年关闭。
Improve this question
我有一个制表符分隔的文件,其中包含两列(ref和alt)。我想通过替换ref列中的alt列字母来创建新列。但我不想用任何替换空行和TTGA(长度大于1)之类的字母
下面是我的输入文件

ref alt
T   C
C   
T   A,C
G   TTGA
C

字符串
预期产量

ref alt         
T   C   C   T   T
C       C   C   C
T   A,C T   A   C
G   TTGA    G   G   G
C       C   C   C


输出的说明
1)在ref列中,T在第一列,第二行,在相邻的alt列中,C存在于第二列,第二行,所以我打印ref列作为新列(见第3列),然后我用alt列中的C替换T
1.在第一列,第三行和相邻的alt列中有C,所以我不会粘贴ref列作为新列。
1.在第一列第4行的ref列中有T,在相邻的alt列中有A,C(第二列第4行),因此按原样粘贴ref列(第4列),我首先用A替换T,然后再次按原样粘贴ref列,并用C替换T(第5列第4行)
1.在第一行中,5t列G在那里,并且在相邻的alt列TTGA(长度大于1)在那里,所以我不会将ref列粘贴为新列。

  1. C在第一列,第6行,但在相邻的alt列没有什么可替换的,所以我不会粘贴ref列,因为它是新列。
yacmzcpb

yacmzcpb1#

Awk解决方案
文件./replaceletters.awk

#! /usr/bin/awk -f

BEGIN {
    FS = OFS = "\t"
}
# First line
NR == 1 {
    print $1,$2
    next
}
# Case: Only one column:
#  A -> A; empty; A; A; A
NF == 1 {
    print $1,"",$1,$1,$1
    next
}
# Case: Two columns, one letter on second column:
#  A; B -> A; B; B; A; A
NF == 2 && length($2) == 1 {
    print $1,$2,$2,$1,$1
    next
}
# Case: Two columns, two letters on second column:
#  A; B,C -> A; B,C; A; B; C
NF == 2 && $2 ~ /^.,.$/ {
    C1 = C2 = $2
    gsub(/,.*$/, "", C1)
    gsub(/^.*,/, "", C2)
    print $1,$2,$1,C1,C2
    next
}
# Case: Other cases with two columns
#  A; X -> A; X; A; A; A
NF == 2 {
    print $1,$2,$1,$1,$1
    next
}

字符串
可执行模式:

chmod +x ./replaceletters.awk


启动方式:

./replaceletters.awk input01.txt


输出量:

ref alt
T   C   C   T   T
C       C   C   C
T   A,C T   A   C
G   TTGA    G   G   G
C       C   C   C

相关问题