我试图仅使用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
,但似乎找不到正确的方法来使它工作。
对不起,我的措词不好,谢谢您的帮助。
答案 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