[英]How to loop over a file having multiple columns to execute an AWK script?
我有一個包含多列(大於1000)的文件。 每列都有數字0、1或其他數字。 制表符分隔的文件如下所示:
0 0 0
0 0 0
1 2 0
1 0 0
1 1 0
我想計算文件中每一列每個唯一數字的出現。 我該如何使用AWK或Shell?
PS為了計算第一列中每個唯一數字的出現,我使用了AWK代碼:
awk '{h[$1]++}; END {for (k in h) print k, h[k]}' file > output-file
結果為:
0 2
1 3
這意味着0
在第1列中出現兩次,而1
在第1列中出現三次。
我想對超過1000列的文件執行相同的操作。
您只需要使關聯數組h
的鍵包含列號i
和列值$i
:
$ awk '{for (i=1;i<=NF;i++) h[i" "$i]++}; END {for (k in h) print k, h[k]}' file | sort -n
1 0 2
1 1 3
2 0 3
2 1 1
2 2 1
3 0 5
上面的最后一行指示列3的值0出現了5次。
更詳細地:
for (i=1;i<=NF;i++) h[i" "$i]++
這將循環從第一列i-=1
到最后列i=NF
所有列。 對於每一列,它將更新該列的計數器h
及其值。
END {for (k in h) print k, h[k]}
這將打印輸出表。
sort -n
因為for (k in h)
不會以任何特定順序生成鍵,所以我們將輸出進行排序。
使用awk 4.0 2D陣列
n = 3列的包含整數值的樣本輸入矩陣
0 0 0
0 0 0
1 2 0
1 0 0
1 1 0
4 0 0
7 -1 -2
輸出是輸入中出現的第0列中數據值的向量,其后是n = 3列的矩陣,每個數據值在輸入矩陣的相應列中計數
-1 0 1 0
-2 0 0 1
0 2 4 6
1 3 1 0
2 0 1 0
4 1 0 0
7 1 0 0
碼
awk '
NR==1 {ncols=NF}
{for(i=1; i <=NF; ++i) ++c[$i][i-1]}
END{
for(i in c) {
printf("%d ", i)
for(j=0; j < ncols; ++j) {
printf("%d ", j in c[i]?c[i][j]: 0)
}
printf("\n")
}
}
'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.