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}
拡張は変数値を検索して置き換えます。 (ファイルに記録マニュアルに)- パターンがパターンで始まる場合、
%
パターンは文字列の末尾に固定されます。ここでは、文字列の末尾の空のパターンを一致させます。 - 変数は配列拡張である可能性があり、その場合は各配列要素に対して置換が発生します。
- パターンがパターンで始まる場合、
正直言って、このアプローチはとても賢いので、より確実なアプローチを選択したでしょう。
答え2
ループを使用してください。
#!/bin/bash
shopt -s nullglob
for file in ???????.mapped.*bam_dp; do
[[ -f "$file" ]] || continue
id=${file%%.*} # grab the ID from file name
sed -i "s/$/ $id/" "$file" # modify the file in-place
done
答え3
$ARGV から .* を削除し、ファイルに \t $ARGV を追加します。
perl -i -pe '$ARGV=~s/\..*//; s/$/\t$ARGV/;' NA*
Glennのソリューションはおそらくより速く実行されます。
perl -i -lpe '$_ .= " " . substr($ARGV,0,index($ARGV,"."))' NA*
ただし、ファイルごとに1行しかないと、ほとんどの時間ドライブが表示されます。
答え4
アッ
この方法はGNU(Linux)およびBSD(Mac)バージョンで動作しますawk
。
awk '{ id=FILENAME ; sub(/\..*/,"",id) ; print $0 "\t" id }' *.bam_dp
id=FILENAME ; sub(/\..*/,"",id)
各ファイル名の最初の部分*.bam_dp
(最初の前のすべての項目.
)をid
。print $0 "\t" id
各ファイルの内容を印刷し、タブ、レコードを印刷しますid
。
例に示すように、行のリストが印刷されます。
1 115258827 10 NA21143
元のファイルは変更されません。たとえば、コマンドの最後に追加して> file.txt
この出力を保存できます。