linux - 如何使这个 AWK 命令不区分大小写?

标签 linux bash shell awk

我正在尝试仅使用 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,但我似乎无法找到使其工作的正确方法。

请原谅我用词不当,感谢您的帮助。

最佳答案

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

#!/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

或者根据 Glenn sir 的评论,使用 shell 技巧使其在变量本身中变为小写。

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


或更多 awksh 方式改变 awk 命令如下(上面是 OP 的命令修复这是使它成为 awksh 风格)

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 之间有空格,这不应该是这种情况所以我也在这里修复了这个问题.

关于linux - 如何使这个 AWK 命令不区分大小写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63886406/

相关文章:

即使 PATH 变量中列出了 Linux shell 命令的路径,也未找到这些命令

bash - 当服务器上的 qsub 提交的作业完成时,在我的本地计算机上运行脚本

node.js - NPM 实时服务器 : command not found

linux - 在循环内调用 sftp 脚本时循环退出

Bash测试值评估

c - 在 C 中运行外部命令(如 awk、sed、grep 等)是否安全?

java - 如何使用 Undertow 启用跨域源

linux - 任务退出后从cgroup中移除

python - Bash 或 Python 用于从文本文件中提取 block

linux - 如何使用 unix 脚本从文件夹中搜索文件并移动到文件夹