【问题标题】:case insensitive awk vlookup不区分大小写的 awk vlookup
【发布时间】:2017-01-16 05:41:48
【问题描述】:

我正在尝试使用 awk 对文件中的第一列进行不区分大小写的 vlookup,但它忽略了 IGNORECASE 并且在小写中不匹配也使用相同的 awk 如何比较第三列

awk -F, 'BEGIN{IGNORECASE=1} FNR==NR{a[$1]=$3","$4;next} {print (($1 in a) ? $0","a[$1] : $0",NA,NA");}'

cat f1.txt
FOO,LONDON,45,789
goo,US,46,9876

cat f2.txt
FOO,LONDON,45,789
GOO,US,46,9876


awk -F, 'BEGIN{IGNORECASE=1} FNR==NR{a[$1]=$3","$4;next} {print (($1 in a) ? $0","a[$1] : $0",NA,NA");}' f1.txt f2.txt

FOO,LONDON,45,789,45,789
GOO,US,46,9876,NA,NA

【问题讨论】:

    标签: awk ksh


    【解决方案1】:

    参见GNU Awk页面的以下摘录,

    另一种特定于 gawk 的方法是将变量 IGNORECASE 设置为非零值(请参阅内置变量)。当 IGNORECASE 不为零时,所有正则表达式和字符串操作都会忽略大小写。

    一般来说,您不能使用 IGNORECASE 使某些规则不区分大小写,而其他规则则区分大小写,因为没有直接的方法可以为特定规则的模式设置 IGNORECASE。17 要做到这一点,请使用括号表达式或降低()。但是,您可以只使用 IGNORECASE 做的一件事是同时为所有规则动态地打开或关闭区分大小写。

    所以使用 GNU Awk's tolower() 函数作为您的输入,

    awk -F, 'FNR==NR{a[tolower($1)]=$3","$4;next} {print ((tolower($1) in a) ? $0","a[tolower($1)] : $0",NA,NA");}' f1.txt f2.txt
    FOO,LONDON,45,789,45,789
    GOO,US,46,9876,46,9876
    

    【讨论】:

    • 是的,它可以工作(得到一个参考在线ignorecase不会在数组上工作),如何为第三列而不是第一列进行模式匹配
    • @Inian,如何对第三列而不是第一列进行模式匹配。但是这两个文件都有大小写字母的混合组合,在这种情况下它会转换为小写并执行匹配。
    • @sam_84:这是一个超出此范围的全新问题。你能用你的输入和所需的输出来问它作为一个新的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-09
    • 2012-12-01
    • 2013-03-06
    • 2020-02-18
    • 2021-01-01
    • 1970-01-01
    相关资源
    最近更新 更多