我试图仅使用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更多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