Ubuntu

awk 不會返回所需的輸出

  • January 29, 2021

我有一個文件,第 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 - FIJI,Fiji Dollar

IGNORECASE變數是一個特殊變數,它影響正則表達式和字元串操作中的大小寫敏感性(如果FS是正則表達式,也可以在欄位拆分中,但awk有關詳細資訊,請參閱系統上的 GNU 手冊),但僅適用於 GNU awk。沒有其他awk人有這個變數。

從您在評論中所說的話,似乎您的預設值awkmawk,而不是 GNU awk

要在非 GNU 中進行不區分大小寫的正則表達式匹配,只需使用orawk將字元串轉換為小寫或大寫,然後使用全小寫或大寫正則表達式: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/:/ - /'.

引用自:https://unix.stackexchange.com/questions/631537