С 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
.
Эрик Прюитт написал впечатляющую реализацию 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