[英]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.