在unix中比较并打印不匹配的字符串

时间:2016-07-18 13:52:00

标签: shell unix awk sed gawk

我有像

这样的文件
123|3a|3b
747|3a|3b|3c|3d
636|3c|3b

输出:

123 -3c 3d
636 -3a 3d 

它应该比较3a,3b,3c,3d并显示缺失的那个。

我尝试使用

awk '/3a/3b/3c/3d' file.txt

但无法弄清楚如何比较单个字符串。

2 个答案:

答案 0 :(得分:0)

这个awk-solution应该完成这项工作

awk -F\| 'BEGIN{OFS=" "}{str=""
           str=sub("3a",$0) ? str : str"3a"
           str=sub("3b",$0) ? str : str"3b"
           str=sub("3c",$0) ? str : str"3c"
           str=sub("3d",$0) ? str : str"3d"
           if(str != ""){gsub(/[abdc]/,"& ",str)
           $0=$1" -"str
           print $0}}' test

限制:第一列不得包含" a"," b"," c"或" d"。

输出:

123 -3c 3d 
636 -3a 3d 

如果" - "更强大不是必需的:

awk -F\| '{str=""
           str=sub("3a",$0) ? str : str"3a"
           str=sub("3b",$0) ? str : str"3b"
           str=sub("3c",$0) ? str : str"3c"
           str=sub("3d",$0) ? str : str"3d"
           if(str != ""){gsub("3"," 3",str)
                         print $1""str}}' test

输出:

123 3c 3d
636 3a 3d

答案 1 :(得分:0)

$ cat list
3a,3b,3c,3d
$
$ cat file
123|3a|3b
747|3a|3b|3c|3d
636|3c|3b
$
$ cat tst.awk
NR==FNR {
    for (i=1; i<=NF; i++) {
        reqd[++numReqd] = $i
    }
    next
}
{
    c=0
    for (i=1; i<= numReqd; i++) {
        if ( $0 !~ "[|]" reqd[i] "([|]|$)" ) {
            printf "%s%s%s%s", (++c>1?"":$1), OFS, (c>1?"":"-"), reqd[i]
        }
    }
    if (c) {
        print ""
    }
}
$
$ awk -f tst.awk FS=',' list FS='|' file
123 -3c 3d
636 -3a 3d