我從這樣的檔案創建各種文本檔案:
Chrom_x,Pos,Ref,Alt,RawScore,PHRED,ID,Chrom_y
10,113934,A,C,0.18943,5.682,rs10904494,10
10,126070,C,T,0.030435000000000007,3.102,rs11591988,10
10,135656,T,G,0.128584,4.732,rs10904561,10
10,135853,A,G,0.264891,6.755,rs7906287,10
10,148325,A,G,0.175257,5.4670000000000005,rs9419557,10
10,151997,T,C,-0.21169,0.664,rs9286070,10
10,158202,C,T,-0.30357,0.35700000000000004,rs9419478,10
10,158946,C,T,2.03221,19.99,rs11253562,10
10,159076,G,A,1.403107,15.73,rs4881551,10
我想做的是在bash中提取兩個值之間的所有值:
gawk '$6>=0 && $NF<=5 {print $0}' file.csv > 0_5.txt
并創建從 6 到 10、從 11 到 15... 從 95 到 100 的檔案。我正在考慮為此創建一個回圈,例如
#!/usr/bin/env bash
n=( 0,5,6,10...)
if i in n:
gawk '$6>=n && $NF<=n 1 {print $0}' file.csv > n_n 1.txt
等等。
我如何將其轉換為回圈并創建具有此特定值的檔案。
uj5u.com熱心網友回復:
雖然您可以使用 shell 回圈為 awk 腳本提供輸入,但您也可以只使用 awk 將值本地拆分為存盤桶,并將這些行寫入這些“存盤桶”檔案本身:
awk -F, ' NR > 1 {
i=int((($6 - 1) / 5))
fname=(i*5) "_" (i 1)*5 ".txt"
print $0 > fname
}' < input
代碼跳過標題行 ( NR > 1),然后通過將第六列中的值除以五來計算“桶索引”。然后通過將該索引(及其增量)乘以五來構造檔案名。然后將整行列印到該檔案名。
要使用 shell 回圈(并在輸入上呼叫 awk 20 次),您可以使用如下內容:
for((i=0; i <= 19; i ))
do
floor=$((i * 5))
ceiling=$(( (i 1) * 5))
awk -F, -v floor="$floor" -v ceiling="$ceiling" \
'NR > 1 && $6 >= floor && $6 < ceiling { print }' < input \
> "${floor}_${ceiling}.txt"
done
基本思想是一樣的;在這里,我們使用外部回圈創建存盤桶索引,然后將范圍作為地板和天花板變數傳遞給 awk。我們只要求 awk 列印匹配的行;來自 awk 的輸出被 shell 捕獲作為重定向到適當的檔案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/476680.html
