アッ

アッ

1000個のファイルを含むフォルダがあります。前のすべての文字はmapped.ILLUMINA.bwa.GIH.low_coverage.20130415.bam_dp個人IDを表します(例:NA21117、NA21119、NA21126、..)。

NA21117.mapped.ILLUMINA.bwa.GIH.low_coverage.20130415.bam_dp
NA21119.mapped.ILLUMINA.bwa.GIH.low_coverage.20130415.bam_dp
NA21126.mapped.ILLUMINA.bwa.GIH.low_coverage.20121211.bam_dp
NA21127.mapped.ILLUMINA.bwa.GIH.low_coverage.20130415.bam_dp
NA21137.mapped.ILLUMINA.bwa.GIH.low_coverage.20120522.bam_dp
NA21142.mapped.ILLUMINA.bwa.GIH.low_coverage.20130415.bam_dp
NA21143.mapped.ILLUMINA.bwa.GIH.low_coverage.20130415.bam_dp

各ファイルには1行しかありません。

cat NA21143.mapped.ILLUMINA.bwa.GIH.low_coverage.20130415.bam_dp
1   115258827   10

各ファイルごとに個々のIDをファイルの内容に貼り付けて、次のような出力を取得したいと思います。

1   115258827   10 NA21143

それを行う方法はありますか?

ベストアンサー1

一般的なバッシュ

for file in *.bam_dp; do 
    contents=$(< "$file")
    echo "$contents ${file%%.*}" > "$file"
done

複数行ファイルの場合は、通常のbashを使用して実行できます。

for file in *.bam_dp; do 
    mapfile -t contents < "$file"
    printf "%s\n" "${contents[@]/%/ ${file%%.*}}" > "$file"
done

メモ:

  • このmapfileコマンドはファイルを行配列として読み込みます。
  • パラメータ${var/pattern/string}拡張は変数値を検索して置き換えます。 (ファイルに記録マニュアルに)
    • パターンがパターンで始まる場合、%パターンは文字列の末尾に固定されます。ここでは、文字列の末尾の空のパターンを一致させます。
    • 変数は配列拡張である可能性があり、その場合は各配列要素に対して置換が発生します。

正直言って、このアプローチはとても賢いので、より確実なアプローチを選択したでしょう。

おすすめ記事