我有这个csv文件,我需要计算满足行条目在特定年份范围之间并且artist_name匹配name参数的条件的行数。但字符串匹配应该不区分大小写。我如何在if循环中实现这一点..
我是初学者,所以请耐心等待我
#!/bin/bash
file="$1"
artist="$2"
from_year="$(($3-1))"
to_year="$(($4+1))"
count=0
while IFS="," read arr1 arr2 arr3 arr4 arr5 arr6 arr7 arr8 arr9 arr10 arr11 ; do
if [[ $arr11 -gt $from_year ]] && [[ $arr11 -lt $to_year ]] && [[ $arr7 =~ $artist ]]; then
count=$((count+1))
fi
done < "$file"
echo $count
$ arr7 =〜$ artist部分是我需要进行修改的地方
答案 0 :(得分:4)
Bash有一个用于将字符串转换为小写的内置方法。一旦它们都是小写的,你可以比较它们是否相等。例如:
$ arr7="Rolling Stones"
$ artist="rolling stoneS"
$ [ "${arr7,,}" = "${artist,,}" ] && echo "Matches!"
Matches!
$ [[ ${arr7,,} =~ ${artist,,} ]] && echo "Matches!"
Matches!
${parameter,,}
将字符串中的所有字符转换为小写字母。如果要转换为大写,请使用${parameter^^}
。如果您只想转换某些字符,请使用${parameter,,pattern}
,其中仅更改匹配pattern
的字符。关于此的更多细节由man
bash`记录:
$ {参数^图案}
$ {parameter ^^ pattern}
$ {parameter,pattern}
$ {参数,,图案}
案例修改。此扩展修改参数中字母字符的大小写。该模式扩展为 只产生一种模式 在路径名扩展中。 ^运算符将匹配模式的小写字母转换为大写;运营商 转换匹配的大写 字母小写。 ^^和,,exansions转换扩展值中的每个匹配字符; ^和,扩展 匹配和转换 只有扩展值中的第一个字符。如果省略pattern,则将其视为一个匹配每个的? 字符。如果参数 是@或*,案例修改操作依次应用于每个位置参数,扩展是 结果清单。如果 parameter是一个用@或*下标的数组变量,case修改操作应用于数组的每个成员 反过来,和 扩展是结果列表。
这些案例修改方法需要bash
版本4(2009年2月20日发布)或更好。
答案 1 :(得分:4)
在bash版本4中引入了bash
案例转换(${var,,}
和${var^^}
)(不久前)。但是,如果您使用的是Mac OS X,则很有可能有bash v3.2,它本身并没有实现大小写转换。
在这种情况下,您可以使用tr
更低效地进行低级别的比较并进行更多输入:
if [[ $(tr "[:upper:]" "[:lower:]" <<<"$arr7") = $(tr "[:upper:]" "[:lower:]" <<<"$artist") ]]; then
# ...
fi
顺便说一句,=~
进行正则表达式比较,而不是字符串比较。你几乎肯定想要=
。此外,您可以使用算术复合命令[[ $x -lt $y ]]
而不是(( x < y ))
。 (在算术扩展中,没有必要使用$
来表示变量。)
答案 2 :(得分:0)
使用shopt -s nocasematch
<强>演示强>
#!/bin/bash
words=(Cat dog mouse cattle scatter)
#Print words from list that match pat
print_matches()
{
pat=$1
echo "Pattern to match is '$pat'"
for w in "${words[@]}"
do
[[ $w =~ $pat ]] && echo "$w"
done
echo
}
echo -e "Wordlist: (${words[@]})\n"
echo "Normal matching"
print_matches 'cat'
print_matches 'Cat'
echo -e "-------------------\n"
echo "Case-insensitive matching"
shopt -s nocasematch
print_matches 'cat'
print_matches 'CAT'
echo -e "-------------------\n"
echo "Back to normal matching"
shopt -u nocasematch
print_matches 'cat'
<强>输出强>
Wordlist: (Cat dog mouse cattle scatter)
Normal matching
Pattern to match is 'cat'
cattle
scatter
Pattern to match is 'Cat'
Cat
-------------------
Case-insensitive matching
Pattern to match is 'cat'
Cat
cattle
scatter
Pattern to match is 'CAT'
Cat
cattle
scatter
-------------------
Back to normal matching
Pattern to match is 'cat'
cattle
scatter