fastq.gz
私のLinuxシステムのディレクトリにR1とR2という名前のファイルがいくつかあります。dir
次のようになります。
dir
|____sampleA_1.fastq.gz
|____sampleA_2.fastq.gz
|____sampleB_1.fastq.gz
|____sampleB_2.fastq.gz
|____sampleC_1.fastq.gz
|____sampleC_2.fastq.gz
txt
最初の列にサンプル名、2番目の列にR1 fastqパス、3番目の列にR2 fastqパスを使用してファイルを作成したいと思います。
内部では、dir
以下を試しました。
find "$PWD" -name \*1.fastq.gz > list1.txt
find "$PWD" -name \*2.fastq.gz > list2.txt
両方のファイルを再結合して列名を指定し、サンプル名で別の列を再作成する必要があります。代わりに単一のコマンドでファイルを作成する方法はありますか?
ファイルはtxt
次のようにする必要があります。
sample Second Third
sampleA dir/sampleA_1.fastq.gz dir/sampleA_2.fastq.gz
sampleB dir/sampleB_1.fastq.gz dir/sampleB_2.fastq.gz
sampleC dir/sampleC_1.fastq.gz dir/sampleC_2.fastq.gz
答え1
サンプルペアが常に存在することを保証できる場合、このbash
/ksh
コードはすべてのサンプル1ファイルの存在に基づいて出力を生成します。
はい(デモ環境の構築):
mkdir -p /tmp/710303/dir
cd /tmp/710303
touch dir/sample{A,B,C}_{1,2}.fastq.gz # Assumes a { }-aware shell
ファイルの作成(デモ環境で動作)
printf "%s %s %s\n" 'sample' 'Second' 'Third'
for f1 in dir/sample*_1.fastq* # Loop through all first samples
do
fn="${f1##*/}"; fn="${fn%%_*}" # Label
f2="${f1/1/2}" # Filename for second sample
printf "%s %s %s\n" "$fn" "$f1" "$f2" # Output the values
done
出力
sample Second Third
sampleA dir/sampleA_1.fastq.gz dir/sampleA_2.fastq.gz
sampleB dir/sampleB_1.fastq.gz dir/sampleB_2.fastq.gz
sampleC dir/sampleC_1.fastq.gz dir/sampleC_2.fastq.gz
これはスペースで区切られた列です。タブで区切るには、(スペース)の代わりに(タブ)をprintf
使用するようにフォーマット行を変更します。\t
答え2
不必要に複雑に見えますが、サンプルファイルが1つだけ存在する状況を処理しています。
{
printf '%s\n' sample Second Third
find ./dir/ -type f -name '*.fastq.gz' -print \
| cut -d _ -f 1 \
| sort -u \
| bash -c '
while read -r root; do
echo "${root##*/}"
for i in 1 2; do
f="${root}_${i}.fastq.gz"
[[ -f "$f" ]] && echo "$f" || echo ""
done
done
'
} \
| paste - - - \
| column -s $'\t' -t
テスト:
mkdir dir
touch dir/sample{A,B,C}_{1,2}.fastq.gz
touch dir/sample{D_1,E_2}.fastq.gz
touch dir/ignore.me
その後、上記のコマンド出力
sample Second Third
sampleA ./dir/sampleA_1.fastq.gz ./dir/sampleA_2.fastq.gz
sampleB ./dir/sampleB_1.fastq.gz ./dir/sampleB_2.fastq.gz
sampleC ./dir/sampleC_1.fastq.gz ./dir/sampleC_2.fastq.gz
sampleD ./dir/sampleD_1.fastq.gz
sampleE ./dir/sampleE_2.fastq.gz
おそらく、このGNU awkバージョンはもう少しきれいになるかもしれません。
find ./dir -type f | gawk -F/ -v OFS='\t' '
BEGIN { print "sample", "Second", "Third" }
match($NF, /^(.*)_([12]).fastq.gz$/, m) {
file[m[1]][m[2]] = $0
}
END {
PROCINFO["sorted_in"] = "@ind_str_asc"
for (sample in file)
print sample, file[sample][1], file[sample][2]
}
' | column -s $'\t' -t
上記と同じ出力を生成します。
答え3
$ cat tst.awk
BEGIN {
FS="[/_]"; OFS="\t"
print "sample", "Second", "Third"
}
NR%2 { second = $0; next }
{ print $2, second, $0 }
$ printf '%s\n' dir/* | awk -f tst.awk
sample Second Third
sampleA dir/sampleA_1.fastq.gz dir/sampleA_2.fastq.gz
sampleB dir/sampleB_1.fastq.gz dir/sampleB_2.fastq.gz
sampleC dir/sampleC_1.fastq.gz dir/sampleC_2.fastq.gz