我有一个文件,其中有第 16 行国家和货币(学习 awk):
bartek@Lenovo-LAB:~/Desktop/bash_lessons/04/demos/Module4_Demo_Files$ sed -n '16p' currencies.csv
FIJI,Fiji Dollar
当我使用 awk 提取一些值时,我没有得到预期的输出:
bartek@Lenovo-LAB:~/Desktop/bash_lessons/04/demos/Module4_Demo_Files$ awk 'BEGIN{IGNORECASE=1; FS=","} /fiji/ { print NR,"-",$0 }' currencies.csv
bartek@Lenovo-LAB:~/Desktop/bash_lessons/04/demos/Module4_Demo_Files$
为什么它不返回16 - 斐济,斐济元?
答案1
该IGNORECASE
变量是一个特殊变量,它会影响正则表达式和字符串操作中的大小写敏感性(如果FS
是正则表达式,也会影响字段分割,但awk
有关详细信息,请参阅系统上的 GNU 手册),但仅适用于 GNU awk
。其他awk
没有这个变量。
从你所说的来看在评论中,看来你的默认设置awk
不是mawk
GNU awk
。
要在非 GNU 中进行不区分大小写的正则表达式匹配,只需使用或awk
将字符串转换为小写或大写,然后使用全小写或大写的正则表达式:tolower()
toupper()
awk -F , 'tolower($0) ~ /fiji/ { print NR, "-", $0 }' currencies.csv
awk -F , 'toupper($0) ~ /FIJI/ { print NR, "-", $0 }' currencies.csv
您还可以grep
用于您在此处执行的任务:
grep -n -i 'fiji' currencies.csv
输出将有一个轻微地不同的格式,每行以 为前缀n:
,其中n
是原始文件的行号。显然,您可以通过将输出传递给 来解决这个问题sed 's/:/ - /'
。