私のファイルには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
上記は、入力内容がタブで区切られていると仮定しています。これが間違っている場合は、質問を編集して明確にしてください。