我想把一个包含一周中的几天的列表转换成一个类似于表格的格式。
输入如下:

Mon 0100
Mon 0700
Tue 0700
Wen 0100
Wen 0700
Thu 0100
Thu 0700
Fri 0100
Fri 0700
Sat 0100
Sun 0100
Sun 0700

输出如下:
        Mon  Tue  Wed  Thu  Fri  Sat  Sun
0100    X         X    X    X    X    X
0700    X    X    X    X    X         X

在awk中寻找理想的答案。最好在输出中保留格式。在不存在工作日的情况下,不应该包含它(如果可能的话,如果输入中不存在,则在输出中包含缺少的工作日,这将是很好的)。
我试了一下,但是除了打印第一行之外,我真的无法理解数组的构造,尽管我认为它相对简单。
谢谢
厄尔

最佳答案

以下是使用awk的一种方法:

awk '
!($1 in day) { days[++d] = $1; day[$1]++ }
!($2 in num) { nums[++n] = $2; num[$2]++ }
             { map[$1,$2]++ }
END {
    printf "\t"
    for (i=1; i<=d; i++) {
        printf "\t%s", days[i]
    }
    print ""
    for (j=1; j<=n; j++) {
        printf "%s ", nums[j]
        for (i=1; i<=d; i++) {
            printf "\t%s", (map[days[i],nums[j]] ? "X" : FS )
        }
        print ""
    }
}' file

输出:
        Mon Tue Wen Thu Fri Sat Sun
0100    X       X   X   X   X   X
0700    X   X   X   X   X       X

09-27 20:49