簡體   English   中英

如何遍歷具有多列的文件以執行AWK腳本?

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

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