r语言 - 替换列中的字母生成新列

  • 本文关键字:新列 r语言 替换 r linux awk
  • 更新时间 :
  • 英文 :


我有一个包含两列(ref和alt)的以制表符分隔的文件。我想通过替换ref列中的所有列字母来创建新列。但我不希望任何替代空行和字母像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列打印为新列(参见第三列),然后我将T替换为alt列中的C

  1. 在第一列,第三行和相邻的alt列中没有C,所以我不会粘贴ref列,因为它是作为新列。

  2. 在ref列的第一列,第四行有T在相邻的alt列有A,C(第二列,第四行)所以粘贴ref列(第四列),我先用A代替了T,然后再粘贴ref列的原样,用C代替了T(第五列,第四行)

  3. 在第一行中,5t列G在那里,在相邻的alt列TTGA(长度大于1)在那里,所以我不会粘贴ref列,因为它是作为新列。

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

一个Awk解决方案

File./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

最新更新