簡體   English   中英

計算兩列之間不匹配的行數,同時以成對方式循環遍歷所有列awk

[英]Count number of row having mismatches between two columns while looping over all columns in pairwise manner awk

我有一個矩陣 (2D),它有 1000 列(由制表符分隔)和 10000 行,我想一次比較兩列的所有行。 類似於一次提取兩列,然后逐行比較這兩列。 如果兩列中的行不同,則計算它。 同樣繼續處理另一對列。 必須在所有對中進行比較(例如第 1-2、1-3,1-4.....2-3,2-4..... 列等)。 第一行包含需要打印的標題,以查看比較了哪兩列。 我試過這個:

awk -vj=${array1[i]} -vk=${array2[i]} '$j !~ "NN" && $k !~ "NN" {print $j,$k}' Input.txt | awk '{if ($1 !~ $2) diff += 1; }END {print diff/NR, diff-1, NR-1}; NR==1 {print $1,$2}' >> Output.txt

其中 array1 和 array2 是包含要比較的列數的文件,這些列數通過 bash 循環。 這對我來說很好,但是花費的時間太多了,這很明顯,因為每次 awk 都需要一次又一次地讀取文件(大小 ~ 400GB)。 我想知道有什么方法可以循環遍歷每一列和每一行,以成對的方式比較它們。 請注意,在比較的任何列中,如果有任何行包含“NN”,則應排除。 這是示例文件:Input.txt

MUN8-12 SAN1-3  SAN2-4
1   1   0
1   0   1
2   2   0
NN  0   0
0   0   NN
3   1   2
0   0   NN
0   0   0
1   NN  NN
1   2   1

預期的輸出將是:Output.txt

MUN8-12 SAN1-3
0.375   3   8
MUN8-12 SAN2-4
0.5 3   6
SAN1-3  SAN2-4
0.714285714 5   7

對於輸出,(第 1、第 3 和第 5 行)字符是標題(比較列的名稱),而第 2、第 4 和第 6 行是兩列之間不同的行數和總列數(沒有“ NN”值;兩列之間的行數不同(不包括標題(-1));以及比較的行數(不包括標題)。

提前感謝您的幫助

最好的事物

阿坎克沙

據我了解,以下內容應類似於您的原始代碼:

$ awk -v n=3 -v m=4                                                 \
      '(FNR==1){print $n,$m; next}
       ($n == "NN") || ($m == "NN") { next }
       ($n != $m) { d++ }
       { c++ }
       END { print d/c,d-1,c-1 }' file

如果您想一次性為所有列執行此操作,您可以執行以下操作:

$ awk 'BEGIN{FS=OFS="\t"}
       (FNR==1) { h=$0 }
       { for(i=1;i<NF;++i) {
           if ($i == "NN") { continue }
           for(j=i+1;j<=NF;++j) {
              if ($j == "NN") { continue }
              c[i,j]+=1
              d[i,j]+=($i != $j)
           }
       }
       END { n=split(h,a)
             for(i=1;i<n;++i) {
               for(j=i+1;j<=n;++j) {
                 print a[i],a[j] ORS d[i,j]/c[i,j],d[i,j]-1,c[i,j]-1
               }
              }
       }' file

由於我們無法訪問簡單的輸入文件,因此未測試此代碼。

拆分文件,使每個文件有一列:例如,通過轉置文件,對於每一行:轉置行並將其保存到文件中。

然后編寫一個程序,該程序需要 2 個文件並計算 2 個文件。

最后以所有組合並行運行該程序(運行 a+b,但不運行 b+a):

parallel --plus compare_two {choose_k} ::: files* ::: files*

這將避免一次又一次地讀取完整的 400 GB 文件,而只會讀取相關的列。 兩列中的第一列通常在緩存中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM