[英]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.