2011-09-28 26 views
4

我使用awk(mac os x)僅打印n個字符或更長的行。awkåä?umlaut-chars的長度爲2

如果我嘗試在一個文本文件(strings.txt),看起來像這樣:

four 
foo 
bar 
föö 
bår 
fo 
ba 
fö 
bå 

我運行這個awk腳本:

awk ' { if(length($0) >= 3) print $0 } ' <strings.txt 

輸出是:

four 
foo 
bar 
föö 
bår 
fö 
bå 

(最後兩行不應該打印)。看起來好像包含變音符(å,ä,ö...)的單詞計爲兩個字符。

(輸入文件保存在UTF8格式)。

+3

所以問題是:是awk(特別是長度)Unicode識別? – 2011-09-28 04:59:20

回答

4

嘗試設置您的區域:

LC_ALL=en_US.UTF-8 awk 'length >= 3' infile 

變化的en_US.UTF-8到您的正確的語言環境。

+0

我是新手,請耐心等待。如何在再次運行awk之前設置區域設置?我嘗試了「LC_ALL = en_US.UTF-8」,但它不起作用... – trillions

+0

您應該使用:LC_ALL = en_US.UTF-8 awk ...或export LC_ALL = en_US.UTF-8; awk ...'。 –

+0

我用第一個選項 LC_ALL = en_US.UTF-8 awk .... 但是,我的腳本無法找到unicode字符串txt,說字符串「名稱」...不知道如何解決這...... – trillions

0

試試這個:

$ echo "four 
foo 
bar 
föö 
bår 
fo 
ba 
fö 
bå 
"|awk ' {x=$0;gsub(/./,"x",x); if(length(x) >= 3) print $0 } ' 

輸出

four 
foo 
bar 
föö 
bår 
+0

哈哈,不錯的解決方案!謝謝。 – Superpanic

+1

這實質上是一個空操作,並不能解決問題 - 你的'awk'是Unicode感知的,或者它不是。如果在正則表達式上下文中匹配一個非ASCII字符,則意味着'length'也會將它識別爲單個字符,並且沒有必要替換它。 – mklement0

2

BSD awk(又名BWK awk),在OS X作爲預裝(尚真爲OSX 10.10.2的)是 - 可悲 - 不支持Unicode。

選擇是:

  • IF你知道涉及到字符放入一個字節編碼如ISO-8859-1,你可以使用iconv如下:

    iconv -f UTF-8 -t ISO-8859-1 file | awk 'length >= 3' | iconv -f ISO-8859-1 -t UTF-8 
    
  • 安裝不同awk執行 Unicode感知,如gawk(GNU Awk)或mawk;例如通過Homebrew
    • brew info gawk
    • brew info mawk
  • 使用不同預裝工具支持Unicode的,如sed

    sed -n '/^.\{3,\}/p' file