awk 不会返回所需的输出

awk 不会返回所需的输出

我有一个文件,其中有第 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不是mawkGNU 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/:/ - /'

相关内容