Shell-Script

有效地加入多個文件

  • June 8, 2021

我知道有一些文章可以加入多個文件,但花了很多時間。我有多個文件,其中第一列是患者的 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_Achr6_A
  • chr1_Bchr6_B
  • chr1_Cchr6_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

引用自:https://unix.stackexchange.com/questions/653299