是否有 Linux 命令用于列之间的字符串减法?
Is there a Linux command for string subtraction between columns?
我正在将一些 SNP 列处理成 vcf 格式。
输入栏如下:
ref ALT
A A G
A A T
T C T
G G T
A A G
C C G T
G A G
T C T
T A G T
预期输出:
ref ALT
A G
A T
T C
G T
A G
C G,T
G A
T C
T A,G
这里一点也不优雅,只是遍历每一行的字段,与第一列比较后决定是否打印。
NR == 1 {print; next}
{
printf "%s",
sep = "\t"
for (i = 2; i <= NF; ++i) {
if ($i != ) {
printf "%s%s", sep, $i
sep = ","
}
}
print ""
}
$ awk -f a.awk file
ref ALT
A G
A T
T C
G T
A G
C G,T
G A
T C
T A,G
$ awk 'BEGIN{FS=OFS="\t"} NR>1{sub(," ",); gsub(/^ +| +$/,"",); gsub(/ +/,",",)} 1' file
ref ALT
A G
A T
T C
G T
A G
C G,T
G A
T C
T A,G
只有当 $1 不包含 RE 元字符并且不能是 $2 中任何字符串的子字符串时,以上内容才有效。
使用 perl 而不是 awk 允许短 one-liner:
$ perl -lane 'print $F[0], "\t", join(",", grep { $_ ne $F[0] } @F)' input.txt
ref ALT
A G
A T
T C
G T
A G
C G,T
G A
T C
T A,G
我正在将一些 SNP 列处理成 vcf 格式。
输入栏如下:
ref ALT
A A G
A A T
T C T
G G T
A A G
C C G T
G A G
T C T
T A G T
预期输出:
ref ALT
A G
A T
T C
G T
A G
C G,T
G A
T C
T A,G
这里一点也不优雅,只是遍历每一行的字段,与第一列比较后决定是否打印。
NR == 1 {print; next}
{
printf "%s",
sep = "\t"
for (i = 2; i <= NF; ++i) {
if ($i != ) {
printf "%s%s", sep, $i
sep = ","
}
}
print ""
}
$ awk -f a.awk file
ref ALT
A G
A T
T C
G T
A G
C G,T
G A
T C
T A,G
$ awk 'BEGIN{FS=OFS="\t"} NR>1{sub(," ",); gsub(/^ +| +$/,"",); gsub(/ +/,",",)} 1' file
ref ALT
A G
A T
T C
G T
A G
C G,T
G A
T C
T A,G
只有当 $1 不包含 RE 元字符并且不能是 $2 中任何字符串的子字符串时,以上内容才有效。
使用 perl 而不是 awk 允许短 one-liner:
$ perl -lane 'print $F[0], "\t", join(",", grep { $_ ne $F[0] } @F)' input.txt
ref ALT
A G
A T
T C
G T
A G
C G,T
G A
T C
T A,G