将列表转置为单元格格式(awk)

Ell*_*Ell 2 unix bash shell awk ksh

我希望将包含一周中几天的列表与其旁边的时间转换为格式化的表格.

输入如下:

Mon 0100
Mon 0700
Tue 0700
Wen 0100
Wen 0700
Thu 0100
Thu 0700
Fri 0100
Fri 0700
Sat 0100
Sun 0100
Sun 0700
Run Code Online (Sandbox Code Playgroud)

输出如下:

        Mon  Tue  Wed  Thu  Fri  Sat  Sun   
0100    X         X    X    X    X    X   
0700    X    X    X    X    X         X    
Run Code Online (Sandbox Code Playgroud)

想要在awk中寻找答案.在给出的输出中保留格式是优选的.在不存在工作日的情况下,不应该包括它(如果可能的话,如果输入中不存在,那么在输出中包含丢失的工作日的答案也会很好).

我给了它一个镜头,但除了打印第一行之外,我真的无法理解数组的构造,即使我想它相对简单.

谢谢Ell

jay*_*ngh 5

这是一种使用方式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
Run Code Online (Sandbox Code Playgroud)

输出:

        Mon Tue Wen Thu Fri Sat Sun
0100    X       X   X   X   X   X
0700    X   X   X   X   X       X
Run Code Online (Sandbox Code Playgroud)