#CHROM POS REF ALT ../S101_sorted.bam ../S102_sorted.bam ../S105_sorted.bam ../S107_sorted.bam ../S113_sorted.bam ../S114_sorted.bam ../S115_sorted.bam ../S
Aradu.A01 296611 T C T T T T T T T T T T T T T T T/C T T/C T T T T
Aradu.A01 326689 T C T/C T T T T/C T T T T/C T/C T T T T T T T T/C T/C T T
Aradu.A01 615910 T G T T T T T T T T T T T T T T T T T T T T T
Aradu.A01 661394 T A T T T T T T/A T T T T T T T T T T T T T T T
Aradu.A01 941674 C T C C/T C C C/T C C C C C C C C C C C C C C C C
Aradu.A01 942064 C T C/T C/T C/T C/T C/T C C C/T C C/T C/T C C C/T C/T C C C C C/T C/T
Aradu.A01 954858 G A G/A G G G G G G G G G G G G G G G G/A G G G G
Aradu.A01 1196780 C A C/A C C C C C C C C C C C/A C C C/A C C C C C C
我有一个上述格式的文件,我正在尝试按_
原样打印由其余列分隔的前两列。我尝试了以下awk
脚本,但它不返回任何输出。
awk '{if (NR>1) print $1"_"$2; for(i=3;i<NF;i++) printf "\t", $i}' input_file > out_file.
任何人都可以建议我在这里做错了什么吗?
答案1
要将前两列之间的空格更改为下划线,我建议sed
:
sed -e 's/[\t ]\+/_/'
如果您需要忽略标题行:
sed -e '/^#/! s/[\t ]\+/_/'
或者,对于更一般的情况(标头可能以任何字符开头;\t
仅适用于gnu sed
)
sed -E '1! s/[[:blank:]]+/_/'
至于有关awk
代码的问题,第一个print
, 可能应该是 a printf
,以免它打印不合时宜的换行符。
答案2
从您的代码开始,这应该会为您提供所需的输出:
awk ' NR>1 {
printf( $1"_"$2 );
for (i=3;i<NF;i++) printf("\t%s", $i);
printf("\n")
}
NR==1 { print } ' input > output
答案3
这似乎有效:
awk '{ if(NR>1) { printf $1"_"$2; for(i=3;i<NF;i++) {printf "\t"$i } } print "" }' input
答案4
这是一个小的 Python 3 脚本,它可以完成这项工作。这里的基本前提是使用两个变量逐个字符地读取每一行——一个变量跟踪第一列到第二列下划线是否已被写入,另一个变量跟踪是否允许用下划线替换空格。
我从OP的输入文件格式中注意到第二列都是数值。因此,我们可以从允许用下划线替换空格开始,但是一旦我们编写了下划线并遇到数字字符(两个条件都为真),我们就可以关闭该write_ok
变量,其他空格将打印为通常。
#!/usr/bin/env python3
import sys
import os
def count_first_spaces(string):
write_ok = True
underscores_ok = False
for char in string:
if char == " " and write_ok:
print("_",end="")
underscores_ok = True
continue
if underscores_ok and char.isdigit():
write_ok = False
print(char,end="")
print("") # add newline
def main():
if not os.path.isfile(sys.argv[1]): sys.exit(1)
with open(sys.argv[1]) as fd:
for line in fd:
if line.startswith('#'): print(line.strip())
else: count_first_spaces(line.strip())
if __name__ == '__main__': main()
这是测试运行:
$ ./add_underscore.py input.txt
#CHROM POS REF ALT ../S101_sorted.bam ../S102_sorted.bam ../S105_sorted.bam ../S107_sorted.bam ../S113_sorted.bam ../S114_sorted.bam ../S115_sorted.bam ../S
Aradu.A01_______296611 T C T T T T T T T T T T T T T T T/C T T/C T T T T
Aradu.A01_______326689 T C T/C T T T T/C T T T T/C T/C T T T T T T T T/C T/C T T
Aradu.A01_______615910 T G T T T T T T T T T T T T T T T T T T T T T
Aradu.A01_______661394 T A T T T T T T/A T T T T T T T T T T T T T T T
如果您希望将该数据保存到不同的文件中,请运行它./add_underscore.py input.txt > output.txt