
#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