我有一个包含两列(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
。
在第一列,第三行和相邻的alt列中没有
C
,所以我不会粘贴ref列,因为它是作为新列。在ref列的第一列,第四行有
T
在相邻的alt列有A,C
(第二列,第四行)所以粘贴ref列(第四列),我先用A
代替了T
,然后再粘贴ref列的原样,用C
代替了T
(第五列,第四行)在第一行中,5t列
G
在那里,在相邻的alt列TTGA
(长度大于1)在那里,所以我不会粘贴ref列,因为它是作为新列。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