各列の重複項目数の計算

各列の重複項目数の計算

私のファイルには100個の列が含まれています。

以下を行う必要があります。

  • まず、各列の重複項目数を計算します。
  • 次に、行数(最大から最小)で出力列の順序を表示します。

入力ファイル:

a     b     c     d     e
11    11    22    56    11
11    44    56    89    11
12    56    78    91    11 
22    60    78          11
22    60    91
      60    98
      91
      91
      95

結果ファイル:

b       c       a       d       e
11      22      11(2)   56      11(4)
44      56      12      89
56      78(2)   22(2)   91
60(3)   91
91(2)   98
95

ベストアンサー1

GNU awk foを使用する配列の配列の合計sorted_in

$ cat tst.awk
BEGIN { FS=OFS="\t" }
NR == 1 {
    numCols = split($0,tags)
    next
}
{
    for ( colNr=1; colNr<=NF; colNr++ ) {
        val = $colNr
        if ( val != "" ) {
            if ( !seen[colNr][val]++ ) {
                ++colRowNrs[colNr]
            }
            rowNr = colRowNrs[colNr]
            numRows = ( rowNr > numRows ? rowNr : numRows )
            rowColVals[rowNr][colNr] = val
            rowColCnts[rowNr][colNr]++
        }
    }
}
END {
    PROCINFO["sorted_in"] = "@val_num_desc"
    for ( colNr in colRowNrs ) {
        tag = tags[colNr]
        printf "%s%s", tag, (colNr<numCols ? OFS : ORS)
    }
    for ( rowNr=1; rowNr<=numRows; rowNr++ ) {
        for ( colNr in colRowNrs ) {
            val = rowColVals[rowNr][colNr]
            cnt = rowColCnts[rowNr][colNr]
            printf "%s%s%s", val, (cnt > 1 ? "("cnt")" : ""), (colNr<numCols ? OFS : ORS)
        }
    }
}

$ awk -f tst.awk file
b       c       a       d       e
11      22      11(2)   56      11(4)
44      56      12      89
56      78(2)   22(2)   91
60(3)   91
91(2)   98
95

上記は、入力内容がタブで区切られていると仮定しています。これが間違っている場合は、質問を編集して明確にしてください。

おすすめ記事