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この変数を持っていません。

あなたが言ったことからコメントから、デフォルト設定がGNUawkではないようです。mawkawk

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/:/ - /'

関連情報