最初の 2 つのフィールドは _ で区切られ、残りのフィールドはそのまま残ります。

最初の 2 つのフィールドは _ で区切られ、残りのフィールドはそのまま残ります。
#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

上記の形式のファイルがあり、_残りの列で区切られた最初の2つの列をそのまま印刷しようとしています。次のスクリプトを試しましたが、awk出力は返されません。

awk '{if (NR>1) print $1"_"$2; for(i=3;i<NF;i++) printf "\t", $i}' input_file > out_file.

誰もが私がここで何を間違っているかを提案できますか?

答え1

最初の2列間のスペースを下線に変更するには、次のことをお勧めしますsed

 sed -e 's/[\t ]\+/_/'

ヘッダー行を無視する必要がある場合:

sed -e '/^#/! s/[\t ]\+/_/'

またはより一般的な場合(ヘッダーは任意の文字で始まり、\tのみ適用されますgnu sed

sed -E '1! s/[[:blank:]]+/_/'

awkコードに関する質問の場合、最初のコードはおそらく見苦しい改行文字を印刷しないようにする必要がprintあります。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スクリプトです。ここでの基本的な前提は、2つの変数を使用して各行の文字を文字ごとに読み取ることです。 1 つは 1 列目の 2 番目の下線が書き込まれたかどうかを追跡し、もう 1 つの変数は空白を下線に置き換えることが許可されているかどうかを追跡します。

OPの入力ファイル形式では、2番目の列がすべて数値であることがわかりました。したがって、スペースをアンダースコアに置き換えることから始めることができますが、アンダースコアを付けて数字を満たすと(両方の条件が真である)、その変数をオフにすると他のスペースが通常どおり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

関連情報