Простая, но логичная проблема с форматированием файла с использованием awk

#regex #bash #shell #sed #awk

#регулярное выражение #bash #оболочка #sed #awk

Вопрос:

Я новичок в этих вещах 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 на etc. и мне нужно их разбить и вставить пробел между ними.

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

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

Комментарии:

1. Извините за неправильное написание formatting in title . Спасибо за редактирование…

Ответ №1:

Вот пример 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. Как вы уже знаете, ввод состоит только из чисел, и <<<"1234 5678 9012" sed -r 's/(..)(..)(s)?/1 23/g' , возможно, пробелов может быть достаточно.

Ответ №2:

 tr -d ' ' < inputFile | sed 's/../amp; /g'
 

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

 sed -e 's/ //g' -e 's/../amp; /g'
 

Комментарии:

1. Можете ли вы объяснить, что именно amp; это делает. Как я уже упоминал, я новичок в этих вещах, поэтому спрашиваю просто из любопытства.

2. amp; здесь означает, что два символа должны быть заменены, т. Е. Команда sed указывает заменять каждую последовательность из двух символов на самих себя, за которыми следует пробел. Первая команда tr удаляет все пробелы из исходного файла, чтобы упростить обработку sed.

3. Оставит ли это пробел перед новой строкой?

4. Как есть, так и будет, но эту проблему было бы легко обойти: ... -e 's/ $//'

Ответ №3:

поскольку в названии вопроса упоминалось «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