繁体   English   中英

如何使此 AWK 命令不区分大小写?

[英]How can I make this AWK command case-insensitive?

我正在尝试仅使用 awk 命令打印 .csv 文件中某个字段的出现次数。 例如在像这样的文件 test.csv 中:

layla;rebel;TAT
han_solo;rebel;TAT
darth_vader;empire;DKS
yoda;rebel;TAT

使用命令:

cat test.csv | ./how_many_are_we.sh dks

我希望有以下输出:

1

这是我在 how_many_are_we.sh 中的代码(工作正常但区分大小写):

#! /bin/bash
awk -F ";" -v location=$1 'BEGIN {count=0;} { if ($3 == location) count+=1} END {print count}'

我尝试在不同的地方添加IGNORECASE=1但我似乎无法找到正确的方法来使它工作。

请原谅我的措辞不好,并感谢您的帮助。

您可以将输入值的大小写和第三个字段更改为小写,然后比较它们的值以确保它们输入的比较不应该受到影响。

#!/bin/bash
awk -F ";" -v location="$1" 'BEGIN {location=tolower(location);count=0;} { if (tolower($3) == location) count+=1} END {print count+0}' Input_file

或根据格伦先生的评论,使用 shell 技巧将变量本身变为小写。

#!/bin/bash
awk -v location="${1,,}" 'BEGIN{FS=";"} (tolower($3) == location){count+=1} END{print count+0}' Input_file


或更多awk sh 方式将awk命令更改为以下(上面是 OP 的命令修复这是使其成为awk sh 样式)

awk -v location="$1" 'BEGIN{location=tolower(location);FS=";"} (tolower($3) == location){count+=1} END{print count+0}'


注意:对于使用IGNORECASE=1 ,您应该在BEGIN部分(如BEGIN{IGNORECASE=1}awk变量-v IGNORECASE="1"提及它。

另外附带说明一下,OP 的 shebang 在#! /bin/bash这不应该是这种情况,所以我也在这里修复了它。

通常,如果您有一个可以轻松处理小写输入的脚本,您可以使用tr转换输入流,因此它也可以操作混合大小写输入。

$ command | tr '[:upper:]' '[:lower:]' | ./script

但是,如果您想屏蔽tr ,您可以默认使用以下重定向将其嵌入到您的脚本中:

#!/usr/bin/env bash
exec 0< <( tr '[:upper:]' '[:lower:]' )
# the rest of your script comes here:
awk '...'

现在允许您执行以下操作:

$ command | ./script

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM