代码之家  ›  专栏  ›  技术社区  ›  justaguy

awk打印匹配行,如果不匹配,则打印“未知”

awk
  •  1
  • justaguy  · 技术社区  · 9 年前

    awk file1 到排队 file2 . 如果两个文件之间未找到匹配项 $1 文件1 然后 unknown 我在 else next . 我不知道为什么语法错误作为 其他的 未知的 条件和 告诉 处理下一行,对吗?还是我的想法错了?两个文件都是 space-delimited

    文件1

    A2M
    A4GALT
    A4GNT
    ABC34
    

    文件2

    A2M AD
    ABC34 AD/AR
    

    A2M AD
    A4GALT unknown
    A4GNT unknown
    ABC34 AD/AR
    

    awk公司

    awk 'NR==FNR{A[$1];next}$1 in A else { print "unknown" }' file1 file2
    
    awk 'BEGIN{FS=OFS="\t"}  # define field and output seperators
        FNR==NR{ # process each field in line of `file1`
             for (i=1; i <= n; i++) {   # execute loop
             d[$1] = $1  # match first element and read into key d
      }
    }
      next   # process next line
    }{print $1, ($1 in d?d[$1]:"unknown")}' file1 file2 # if no match 
    print $1 followed by unknown
    
    3 回复  |  直到 9 年前
        1
  •  1
  •   RomanPerekhrest    9 年前

    参加 分类 实现目标的一条路线:

    join -a1 -a2 -e "unknown" -o1.1,2.2 <(sort file1) <(sort file2)
    

    A2M AD
    A4GALT unknown
    A4GNT unknown
    ABC34 AD/AR
    
        2
  •  1
  •   Ed Morton    9 年前
    awk 'NR==FNR{a[$1]=$2;next} {print $1, ($1 in a ? a[$1] : "unknown")}' file2 file1
    

    第一个脚本中的语法错误为:

    $1 in A else
    

    你的意思可能是:

    !($1 in A)
    

    但我很好奇你是怎么想到这个的-你在哪里用过什么语言 condition else condition ? 你已经问了几十个问题并得到了答案——他们都没有使用 !

    next 在任何 {...} 配对,你有一个太多了 } s、 你可以数一数看。

        3
  •  1
  •   JFS31    9 年前

    我想到了这个:

    awk 'NR==FNR{ a[$1]; next }$1 in a{ print $1,$2; delete a[$1] }END{ for ( i in a ) print i, "unknown" }' file1 file2 | sort
    

    A2M AD
    A4GALT unknown
    A4GNT unknown
    ABC34 AD/AR