Простая, но логичная проблема с форматированием файлов с использованием awk - PullRequest
0 голосов
/ 30 октября 2011

Я новичок в этих вещах на awk и shell и застрял в простой, но логичной проблеме ..

Входной файл:

6000 9876 5675 ....
8576 8765 9845 ...
....

Выходной файл: (обязательно)

60 00 98 76 56 75 ....
85 76 87 65 98 45 ...
....

Преобразование вывода в ввод - довольно простая задача

awk '{printf("%s%s %s%s %s%s %s%s", $1, $2, $3, $4, $5, $6, $7, $8)}' output_file
                                                          > input_file

Но при преобразовании ввода в вывод я не догадываюсь

(также число полей не известно заранее, хотя я думаю, что некоторая логика с NF может решить эту проблему), но главная проблема, даже если я не знаю, нет. файлов тогда, как действовать для этого ??

Мин. читаемый модуль будет выглядеть как $1,$2 и т. д., и мне нужно разбить их и вставить пробел между ними.

Я не очень разбираюсь в regex, но пробую себя в этом. Может быть, некоторые манипуляции с sed и regex могут мне помочь.

Пожалуйста, предоставьте ваши ценные предложения.

Ответы [ 3 ]

2 голосов
/ 30 октября 2011

Вот пример sed:

$ echo "1234 5678 9012"|sed -e 's/\([0-9][0-9]\)\([0-9][0-9]\)/\1 \2/g'
12 34 56 78 90 12
1 голос
/ 30 октября 2011
tr -d ' ' < inputFile | sed 's/../& /g'

В качестве альтернативы, чтобы избежать первого tr:

sed -e 's/ //g' -e 's/../& /g'
0 голосов
/ 30 октября 2011

поскольку в названии вопроса упоминалось "awk", я дал решение awk, хотя уже принят ответ:

это нуждается в пристальном внимании:

kent$  echo "6000 9876 5675
8576 8765 9845"|awk '{for(i=1;i<=NF;i++)$i=gensub(/^([0-9]{2})([0-9]{2})$/,"\\1 \\2","g",$i);print }'                                    
60 00 98 76 56 75
85 76 87 65 98 45
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...