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

时间:2020-09-14 14:32:18

标签: 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,但似乎找不到正确的方法来使它工作。

对不起,我的措词不好,谢谢您的帮助。

2 个答案:

答案 0 :(得分:5)

您可以将输入值的大小写更改为小写,然后将第三个字段的值更改为小写,然后比较它们的值以确保无论输入多少,比较都不会受到影响。

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

OR按照Glenn先生的评论,使用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}或{{ 1}}变量awk

另外,OP的shebang在-v IGNORECASE="1"#!之间留有空格,这种情况不应该出现,因此我也在此处进行了修正。

答案 1 :(得分:0)

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