awk的集合操做實現

需求

有一份人員名單,另有一些已上交的文件,文件名包含人員姓名或編號
問題:誰沒交?數組

思路

這實際上是數據結構裏的集合操做
若人員名單爲集合A,文件名爲集合B,則沒交的人員集合C=A-B數據結構

實例

名單(list.txt):
1 a
2 b
3 c
4 d
5 e
文件列表:
a_1.xls
b.xls
3.xls
誰沒交?
d,ecode

代碼

#~ ls 文件夾/ | gawk -f set.awk list.txt -

BEGIN {
    op = "diff"  # 默認求差集;交集爲inst
}

#~ 第一個文件爲完整名單
FILENAME == ARGV[1] {
    #~ num = $1
    #~ name = $2
    for (i=1; i<=NF; i++) {
        a[NR, i] = $i  # 取出各項
    }
    nf = NF  # 假定項數固定
}

# 名單(模擬二維數組)關聯項處理
function handle(a, i, o) {
    for (j=1; j<=nf; j++)
        if ((i, j) in a)  # 判斷索引存在
            switch (o) {
                case "print":
                case "inst": print a[i, j]
                    break
                case "diff": delete a[i, j]  # 剩餘項爲差集
                    break
            }  
}

#~ 後面的爲文件列表
FILENAME == ARGV[2] {
    #~ print length(a)
    for (i in a) {
        #~ print bname,bnum,a[i, 2],a[i, 1],$0
        if (match($0, a[i])) {  # 若任一項能匹配(search的中文支持彷佛有問題)
            split(i, ss, SUBSEP)
            idx = ss[1]  # 名單索引
            #~ print ss[1],ss[2]
            handle(a, idx, op) 
            next
        }
    }
}

END {
    if (op == "diff") {
        for (i in a)
            print a[i]
    }
}
相關文章
相關標籤/搜索