我有这个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
Run Code Online (Sandbox Code Playgroud)
$ arr7 =〜$ artist部分是我需要进行修改的地方
Bash具有将字符串转换为小写的内置方法。一旦它们都是小写,就可以比较它们是否相等。例如:
$ arr7="Rolling Stones"
$ artist="rolling stoneS"
$ [ "${arr7,,}" = "${artist,,}" ] && echo "Matches!"
Matches!
$ [[ ${arr7,,} =~ ${artist,,} ]] && echo "Matches!"
Matches!
Run Code Online (Sandbox Code Playgroud)
${parameter,,}将字符串中的所有字符转换为小写。如果要转换为大写,请使用${parameter^^}。如果只想转换某些字符,请${parameter,,pattern}在仅pattern更改那些匹配字符的地方使用。manbash 记录了更多关于此的细节:
$ {parameter ^ pattern}
$ {parameter ^^ pattern}
$ {parameter,pattern}
$ {parameter,pattern}案例修改。 此扩展修改了参数中字母字符的大小写。与路径名扩展一样,扩展模式以产生模式。^运算符将小写字母匹配模式转换为大写;,运算符将匹配的大写字母转换为小写字母。^^和,,扩展会转换扩展值中的每个匹配字符;^和扩展名仅匹配并转换扩展值中的第一个字符。如果省略了pattern,则将其视为与每个字符匹配的?。如果parameter是@或*,则大小写修改操作依次应用于每个位置参数,并且扩展名是结果列表。如果parameter是一个用@或*下标的数组变量,
这些案例修改方法需要bash版本4(于2009年2月20日发行)或更高版本。
的bash情况下,转换(${var,,}和${var^^})进行了介绍(前一段时间)在bash版本4.但是,如果您使用的是Mac OS X,你最有可能在没有实现的情况下,改造本身的bash V3.2。
在这种情况下,您可以使用以下命令来进行小写比较,效率更低,输入更多tr:
if [[ $(tr "[:upper:]" "[:lower:]" <<<"$arr7") = $(tr "[:upper:]" "[:lower:]" <<<"$artist") ]]; then
# ...
fi
Run Code Online (Sandbox Code Playgroud)
顺便说一句,=~执行正则表达式比较,而不是字符串比较。您几乎可以肯定想要=。另外,[[ $x -lt $y ]]也可以使用算术复合命令:来代替(( x < y ))。(在算术扩展中,不必使用$来指示变量。)