3

У меня есть файл, как это:

123123213,456,be
124243233,4346,ytr
123123123,436535,uytr
324234324,322,yt
234324323,32,tyutr

Я хочу обнулить среднее поле, чтобы получить результат:

123123213,00000456,be
124243233,00004346,ytr
123123123,00436535,uytr
324234324,00000322,yt
234324323,00000032,tyutr

Как мне сделать скрипт, который будет делать это?

Я видел такой пример

awk '{ $6=sprintf("%06s", $6); print $0}'

но я не совсем понимаю и поэтому не могу заставить его работать.

3 ответа3

7

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

awk -F , '{ printf "%i,%08i,%s\n" , $1 , $2 , $3 }' file
1

Так как вы помечено ваш вопрос [sed] здесь sed версия , основанная на сценарии здесь.

sed 's/[^,][^,]*/\n0000000&/2;s/\n[^,]*\(.\{8\}\),/\1,/' inputfile

Объяснение:

  • поле состоит из группы из одной или нескольких запятых: [^,][^,]* (это также можно записать как [^,]\+ )
  • замените второе поле (match) (s///2 ) новой строкой, набором нулей и содержимым соответствия: \n0000000& (новая строка используется, чтобы отметить начало поля для следующего шага)
  • теперь соответствует символу новой строки, нулю или большему количеству запятых и ровно восьми \{8\} любого символа (захват этих символов \(\) ), за которым следует запятая
  • заменить захваченные символы \1 на совпадение, это удалит временный перевод строки и лишние нули

Это работает так, чтобы добавить лишние нули в начале поля, а затем отрубить все, кроме

0

Команда в вашем вопросе правильная, просто нужно обновить.

awk '{ $6=sprintf("%0.8s", $6); print $0}'

также для изменения использования выходного поля разделителя:

awk '{ OFS="\xE7"; $6=sprintf("%0.8s", $6); print $0}'

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .