awk åäö umlaut-chars имеет длину 2 - PullRequest
5 голосов
/ 28 сентября 2011

Я использую awk (mac os x) для печати только строк длиной не более n символов.

Если я попробую его в текстовом файле (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 ]

4 голосов
/ 28 сентября 2011

Попробуйте установить язык:

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

Измените en_US.UTF-8 на ваш правильный язык.

3 голосов
/ 13 октября 2012

BSD awk (он же BWK awk), как предустановлено на macOS (по-прежнему верно для macOS 10.13), - к сожалению - НЕ поддерживает 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
    
0 голосов
/ 28 сентября 2011

попробуйте это:

$  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
...