使用两个文件比较列和行并打印条件值

时间:2015-07-15 17:56:12

标签: unix awk

我有两个文件:

归档一个

,air,rode,hand,man,chip,dog
clock,,,,,,
mind,,,,,,
finger,,,,,,
tuna,,,,,,

文件二

mind,air,rode
clock,hand,man,dog
finger,air,rode,hand,dog
tuna,chip,dog
desk,chip,hand,
move,dog,air,rode

正在发生的事情是文件2中不在第一列中的所有唯一字符串都已转换为文件1的第一行。此外,每个文件的第一列都有一组字符串,文件1的第一列中的每个字符串都存在于文件2的第一列中,但不是文件2的第一列中的每个字符串都存在于第一列中。文件1.我想要做的是使用这两个文件,以便如果文件1的第1行中的字符串存在于文件2的任何行中,则对于两个文件的第一列中的匹配字符串,则一个是打印,否则打印零

所以输出结果为:

,air,rode,hand,man,chip,dog
clock,0,0,1,1,0,1
mind,1,1,0,0,0,0
finger,1,1,1,0,0,1
tuna,0,0,0,0,1,1

1 个答案:

答案 0 :(得分:1)

此脚本应完成大部分任务,但订单将在第二个文件中指定

    NR == 1 {                            # grab first line from file 1
            n = split($0, cols, ",")     # n is the number of fields
            print $0
            next
    }

    FNR == NR       {                    # grab required row keys from file 1
            keys[$1] = 1
    }

    FNR != NR && $1 in keys {            # process file 2 for the keys
            for (i = 2; i <= NF; i++) {  # construct a map for the given associations
                    map[$1, $i] = 1
            }
            line = $1                    # construct line, starting with key
            for (i = 2; i <= n; i++) {   
                    v = ($1, cols[i]) in map   # does the mapping exist?
                    line = line FS v           # add the value to line separated with FS
            }
            print line                   # print line
    }

$ awk -F, -f script.awk file1.txt file2.txt

将给出

,air,rode,hand,man,chip,dog
mind,1,1,0,0,0,0
clock,0,0,1,1,0,1
finger,1,1,1,0,0,1
tuna,0,0,0,0,1,1

如果需要由文件1指定订单,则可以将行放在数组中并在END块中打印。