Shell-Script
有效地加入多個文件
我知道有一些文章可以加入多個文件,但花了很多時間。我有多個文件,其中第一列是患者的 ID,然後我想根據第一列中的 ID 號加入多個文件。
下面的程式碼仍然有效,但花了很多時間。因此,有人知道執行此過程的更有效方法嗎?
for PHENO in A B C D E F G H I J K L M do join -a1 -a2 -e 1 -o auto chr2_${PHENO} chr3_${PHENO} >${PHENO} done for PHENO in A B C D E F G H I J K L M do for file in chr5_${PHENO} chr11_${PHENO} chr14_${PHENO} chr20_${PHENO} \ chr21_${PHENO} chr22_${PHENO} chr6_${PHENO} chr9_${PHENO} chr13_${PHENO} \ chr18-1_${PHENO} chr18-2_${PHENO} chr1-1_${PHENO} chr1-2_${PHENO} \ chr1-3_${PHENO} chr8-1_${PHENO} chr8-2_${PHENO} chr17-1_${PHENO} \ chr17-2_${PHENO} chr19-1_${PHENO} chr19-2_${PHENO} chr19-3_${PHENO} \ chr19-4_${PHENO} chr4-1_${PHENO} chr4-2_${PHENO} chr4-3_${PHENO} \ chr4-4_${PHENO} chr7-1_${PHENO} chr7-2_${PHENO} chr7-3_${PHENO} \ chr10-1_${PHENO} chr10-2_${PHENO} chr10-3_${PHENO} chr10-4_${PHENO} \ chr12-1_${PHENO} chr12-2_${PHENO} chr12-3_${PHENO} chr12-4_${PHENO} \ chr15-1_${PHENO} chr15-2_${PHENO} chr15-3_${PHENO} chr16-1_${PHENO} \ chr16-2_${PHENO} chr16-3_${PHENO}; do join -a1 -a2 -e 1 -o auto ${PHENO} "$file" >${PHENO}.1 mv ${PHENO}.1 ${PHENO} done done
所有文件如下。150001 名患者,以 0 或 1 顯示他們是否患有疾病。例如,chr2_${PHENO}
ID Disease 1 0 2 1 3 0 4 1 5 1 .... 150000 0 150001 1
例如,chr3_${PHENO}
ID Disease 1 1 2 1 3 1 4 0 5 0 .... 150000 0 150001 0
先感謝您!
好的。這本身不是一個答案,而是一個可能澄清事情的文章。
將您需要的內容納入您的問題。
(對不起,知道這不是通常的事情,但是……)
這是否類似於您的文件和所需的結果?
這是兩個範例腳本。首先生成虛擬文件:
- chr1_A到chr6_A
- chr1_B到chr6_B
- chr1_C到chr6_C
按使用排序
LC_ALL=C sort -k 1b,1
#! /bin/bash for p in A B C; do for i in $(seq 1 6); do f="chr${i}_$p" printf 'ID %s\n' "$i.$p" >"$f" paste <(shuf -n 24 -i 1-222) <(shuf -n 24 -i 0-1 -r) | \ LC_ALL=C sort -k 1b,1 >>"$f" done done
給出一個樣本組,如:
paste chr* | column -t
ID 1.A ID 1.B ID 1.C ID 2.A ID 2.B ID 2.C ... 116 1 107 1 101 0 110 1 105 1 111 0 ... 126 1 11 1 105 0 111 1 106 1 117 1 ... 131 1 111 0 106 0 121 0 113 0 121 0 ... 141 0 133 0 110 0 124 0 147 0 145 0 ... 167 1 135 1 113 1 135 0 154 0 146 1 ... ...
不確定這是否正確,您決定。
第二個腳本是您的修改版本(例如,使用破折號表示缺失,以便與真實數據區分開來):
#! /bin/bash for PHENO in A B C; do join -a1 -a2 -e - -o auto chr1_${PHENO} chr2_${PHENO} >${PHENO} done for PHENO in A B C; do for n in 3 4 5 6; do file="chr${n}_$PHENO" join -a1 -a2 -e - -o auto ${PHENO} "$file" >${PHENO}.1 mv ${PHENO}.1 ${PHENO} done done
產生三個文件A、B和C:
$ paste A B C | column -t ID 1.A 2.A 3.A 4.A 5.A 6.A ID 1.B 2.B 3.B 4.B 5.B 6.B ID 1.C 2.C 3.C 4.C 5.C 6.C 10 - - 1 1 - - 101 - - 1 - - 1 101 0 - 0 - - 1 100 - - - 0 - - 102 - - - - - 0 103 - - - - - 0 102 - - 1 - 0 - 105 - 1 0 - 0 - 105 0 - - - - - 108 - - 0 - - - 106 - 1 - - - 1 106 0 - - - 1 - 109 - - - - - 1 107 1 - - - - - 107 - - - - - 0 110 - 1 - - - - 109 - - - - - 0 108 - - - - - 0 111 - 1 - - - - 11 1 - - - - - 109 - - - 1 0 - 116 1 - - - - - 111 0 - - - - - 110 0 - - - - - 117 - - - - 1 - 113 - 0 - - - - 111 - 0 - - - - ... # or # paste <(sort -n A) <(sort -n B) <(sort -n C) | column -t