我正在嘗試撰寫一個 for 回圈來解壓縮檔案名中包含 R1 的 fastq.gz 檔案,確定每個檔案中的行數,并將行數除以 4。理想情況下,我也可以將其寫入 txt 檔案兩列(檔案名和行數/4)。
此回圈解壓縮 R1 fastq 檔案并確定每個檔案中的行數,但不除以 4(或將輸出保存到 txt 檔案中)。
for i in $(ls ./ R1 ); 做 gzcat ./$i | wc -l 完成;
此處的其他帖子建議使用 bc 在 bash 中進行劃分,但我無法將其集成到回圈中。
uj5u.com熱心網友回復:
您永遠不會使用for i in $(ls anything),請參閱Bash Pitfalls #1。對于帶有空格或任何其他特殊字符的檔案名,您的回圈將失敗。在大多數情況下,您只需使用 迭代檔案for i in path/*; do ...,但要了解,如果檔案名包含'\n'字符作為名稱的一部分,則可能會失敗。處理所有檔案名的最佳方法是使用findas while read -r name; do ... done < <(find path -type f -name "*.gz")(注意行程替換,< <(...)僅是 bash 構造,如果使用 POSIX shell,則通過管道連接到回圈)
接下來,要將名稱和行數 / 4 寫入新檔案,請將整個回圈包裝在一個新的范圍內,{ .... }然后簡單地將所有輸出一次重定向到新檔案。
您還應該添加驗證以檢查檔案是否是結尾的目錄gz并跳過任何找到的檔案,以及跳過任何空檔案(檔案大小為零)
如果您完全這樣做,您可以執行以下操作:
{
for i in R1/*.gz; do
[ -d "$i" ] && continue ## skip any directories
[ -s "$1" ] && continue ## skip empty files
nlines=$(gzcat "$i" | wc -l) ## get number of lines
printf "%s\t%s\n" "$i" $((nlines / 4)) ## output name, nlines / 4
done
} > newfile ## redirect all output to newfile
(輸出用分隔名稱和數字 / 4的tab字符寫入 - 根據需要調整)"\t"
看看事情,如果你有任何問題,請告訴我。
uj5u.com熱心網友回復:
進行整數運算的最簡單方法是使用$((...))符號,從這些簡單的示例中可以看出:
Prompt> echo $((2*6))
12
Prompt> echo $((20/4))
5
Prompt> echo $((21/4))
5
它也可以與其他命令結合使用,例如wc -l:
Prompt> cat .viminfo | wc -l
287
Prompt> echo $(($(cat .viminfo | wc -l) / 4))
71
uj5u.com熱心網友回復:
如果您允許 5 / 4 = 1(因此向下舍入到最接近的整數),這將起作用。如果您想使用小數 (5 / 4 = 1.25),那么您需要bc或awk
for i in $(ls ./R1); do
nb_lines=$(gzcat ./$i | wc -l)
echo $((nb_lines / 4))
done;
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/448360.html
