Получить ширину отображения строки символов

С awk у вас может сработать что-то вроде

awk '/^661/{f=substr($0,match($0,/2016[0-9]{4}/),8)".txt"}{print>>f}' file.txt

.

В основном это следующие части:

/^661/{...} # on each line starting with 661

match($0,/2016[0-9]{4}/) # find the index of the date (2016MMDD) in current line

substr($0,match($0,/2016[0-9]{4}/),8) # extract the the date in the current line

f=substr($0,match($0,/2016[0-9]{4}/),8)".txt" # assign it to f and append ".txt"

{print>>f} # redirect the content of the current line into the file named by f

В традиционной реализации awk вам, возможно, придется заменить интервальные выражения на:

awk '/^661/{f=substr($0,match($0,/2016[01][0-9][0-9][0-9]/),8)".txt"}{print>>f}' file.txt

В зависимости от вашего варианта использования вы также можете захотеть для изменения поведения перенаправления , то есть print> f vs. print >> f .

15
13.04.2017, 15:36
1 ответ

Эрик Прюитт написал впечатляющую реализацию wcwidth()и wcswidth()в Awk, доступную по адресу wcwidth.awk . Он в основном обеспечивает 4 функции

wcscolumns(), wcstruncate(), wcwidth(), wcswidth()

, где wcscolumns()также допускает непечатаемые -символы.

$ cat wcscolumns.awk 
{ printf "%d\n", wcscolumns($0) }
$ awk -f wcwidth.awk -f wcscolumns.awk <<< 'unix'
8
$ awk -f wcwidth.awk -f wcscolumns.awk <<< 'Stéphane'
8
$ awk -f wcwidth.awk -f wcscolumns.awk <<< 'もで 諤奯ゞ'
11
$ awk -f wcwidth.awk -f wcscolumns.awk <<< $'My sign is\t鼠鼠'
14

Я открыл вопрос с вопросом об обработке TAB, поскольку wcscolumns($'My sign is\t鼠鼠')должно быть больше 14.Обновление:Эрик добавил функцию wcsexpand()для расширения табуляций до пробелов:

$ cat >wcsexpand.awk 
{ printf "%d\n", wcscolumns( wcsexpand($0, 8) ) }
$ awk -f wcwidth.awk -f wcsexpand.awk <<< $'My sign is\t鼠鼠'
20
$ echo $'鼠\tone\n鼠鼠\ttwo'
鼠      one
鼠鼠    two
$ awk -f wcwidth.awk -f wcsexpand.awk <<< $'鼠\tone\n鼠鼠\ttwo'
11
11
3
27.01.2020, 19:50

Теги

Похожие вопросы