如何使此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,但似乎找不到正确的方法来实现它。

请原谅我措辞不好,谢谢你的帮助。

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

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


OR更多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之间有空格,这不应该是这样的,所以我在这里也解决了这个问题。

通常,如果您有一个可以轻松处理小写输入的脚本,则可以使用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

最新更新