次のコマンドを使用して22個のファイルを作成します。
user@host$ awk '{ print $1, $3, $4, $5 }' chr22.gen > snps22
user@host$ awk '{ print $1, $3, $4, $5 }' chr21.gen > snps21
...
user@host$ awk '{ print $1, $3, $4, $5 }' chr1.gen > snps1
出力ファイルは次のとおりです。
user@host$ head snps21
rs885550 9887804 C T
rs169757 9928594 A C
rs210498 9928860 C T
rs210499 9929079 C A
rs303304 9941889 A G
...
私がしたいのは、これらの出力ファイル(snps22
、、、...)を変更することです。たとえば、次のようになります。snps21
snps20
snps21
user@host$ head snps21
rs885550 21:9887804:C:T
rs169757 21:9928594:A:C
rs210498 21:9928860:C:T
rs210499 21:9929079:C:A
rs303304 21:9941889:A:G
...
したがってchr21.gen
、コロンを使用して入力ファイル名の数(21など)を出力ファイルの2番目の列に連結し、コロンを使用して2番目、3番目、および4番目の列を連結する必要があります。
答え1
ファイルが示されているとおりに正しく呼び出されると仮定すると(文字列snps
の後に染色体名が続く場合)、次のようになります。
for name in snps*; do
awk 'FNR == 1 { chr = substr(FILENAME, 5) }
{ printf("%s %s:%s:%s:%s\n", $1, chr, $2, $3, $4) }' "$name" >"$name.new"
done
これにより、次の方法でファイル名から染色体名が抽出されますsubstr()
(染色体名は、ファイル名の5番目の文字から始まるすべての文字です)。FNR == 1
これは、ファイルの最初の行()を読むときにのみ行われます。その後、コードは現在の行を目的の形式で出力し、printf()
染色体名を含みます。
その後、データは.new
ファイル名のサフィックスが付いたファイルに書き込まれます。
awk
出力を作成する場所を選択してシェルループを削除できます。
awk 'FNR == 1 { chr = substr(FILENAME, 5); name = FILENAME ".new" }
{ printf("%s %s:%s:%s:%s\n", $1, chr, $2, $3, $4) >name }' snps*
すべての出力を1つのファイルに収集しますか?十分
awk 'FNR == 1 { chr = substr(FILENAME, 5) }
{ printf("%s %s:%s:%s:%s\n", $1, chr, $2, $3, $4) }' snps* >all_snps
.gen
変更されたバリエーションを持つ元のファイルにも適用できます。
awk 'FNR == 1 { chr = substr(FILENAME, 4); sub("\.gen$", "", chr)
name = "snps" chr }
{ printf("%s %s:%s:%s:%s\n", $1, chr, $3, $4, $5) >name }' chr*.gen
または単一出力ファイルの場合
awk 'FNR == 1 { chr = substr(FILENAME, 4); sub("\.gen$", "", chr) }
{ printf("%s %s:%s:%s:%s\n", $1, chr, $3, $4, $5) }' chr*.gen >all_snps
データから少し異なる列を選択して染色体名を見つけるには、ファイル名の他の部分を抽出します。
答え2
bash(およびsedとtr)を使ってすばやく試してください。
for i in snps*
do
n=$(echo $i |tr -d 'a-zA-Z')
sed -i -e "s/ / $n:/" -e 's/ \([A-Z]\)/:\1/g' $i
done
これは単にsnps2で始まるファイルセットを繰り返し、各ファイルの名前からすべてのアルファ文字を削除して数値部分を取得し、sed(a)を使用して最初のスペースを数値部分であるスペースに置き換えます。 file 名とコロン、 (b) 大文字の後の各スペースをコロンで置き換えます。私はawkを使ってこれをうまくやることができると確信しています。