前两个字段用 _ 分隔,其余字段保持原样

前两个字段用 _ 分隔,其余字段保持原样
#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

相关内容