ファイル名に文字列を追加して列に挿入して変更するにはどうすればよいですか?

ファイル名に文字列を追加して列に挿入して変更するにはどうすればよいですか?

次のコマンドを使用して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、、、...)を変更することです。たとえば、次のようになります。snps21snps20snps21

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

データから少し異なる列を選択して染色体名を見つけるには、ファイル名の他の部分を抽出します。

おすすめ記事