Intereting Posts
Наблюдение за ответами ping под DNAT Как вы можете регистрировать каждую введенную команду Выполнение заданий на основе изменения времени Клиент LDH RHEL6 не перечисляет все группы Не удается подключиться к серверу Windows с помощью rdesktop – ошибка «Отсутствие действительной лицензии» Файловая система Linux, которая устарела от старых файлов, когда раздел заполнен Настройка IPSEC в локальной сети между двумя хостами (OpenBSD) NetBSD предоставляет цифровые подписи для официальных образов ISO и бинарных пакетов? Несколько вопросов об установке нескольких разделов (в Ubuntu 14.10) Ошибка PlayOnLinux в приложении при изменении моего часового пояса Как отображать дубликаты между 2 репозиториями Debian – установите необходимый компакт-диск Виртуальная машина VirtualBox как хост nginx Управляющие символы не отображаются в моем терминале (например, когда я нажимаю «^ C») Файл для назначенных адресов inet

Как преобразовать поля фиксированной длины в файл в пространство с разделителями

У меня есть файл с фиксированной длиной матрицы, где каждое поле имеет длину 20 символов.

  1. Как я могу преобразовать это в файл с разделителями пробелов?

Также есть некоторые отсутствующие значения, которые я хотел бы заменить дефис ( - ).

  1. Как я мог это достичь?

Я буду использовать вывод для awk операций.

Пример ввода с 10-значным файлом длины поля.

  head1 head2 head3 abc cca 

Пример вывода

 head1 head2 head3 abc - c - c - c 

Perl:

 perl -ne ' BEGIN {$width = 10} while (length) { ($word = substr($_,0,$width)) =~ s/^\s+|\s+$//g; # trim whitespace $word ||= "-"; print $word, " "; substr($_,0,$width) = ""; } print "\n"; ' file 

Это сработало для меня:

 sed 's/^ //g' input | tr -s "[:blank:]" "," | \ awk -F, '!$1{printf "- "} $1{printf "%s ", $1} \ !$2{printf "- "} $2{printf "%s ", $2} \ !$3{print "-"} $3{print $3}' 

Объяснение:

  • sed 's/^ //g' input удаляет ведущее пространство, если оно присутствует
  • tr -s "[:blank:]" "," : заменяет все пробелы запятой
  • awk ... : использует разделитель и печатает значения или - если значение пустое.

Awk путь

 awk '{for(x=0;x<length($0);x+=10)y=y" "((z=substr($0,x,10))~/[[:graph:]]/?z:"-") gsub(/ +/," ",y);print y;y=""}' file 

Если они могут иметь пробелы в полях

 awk '{for(x=0;x<length($0);x+=10){z=gensub(/(^ +| +$)/,"", "g",substr($0,x,10)) y=y" "(z?z:"-")}print y;y=""}' file 

Если у вас есть gawk вы можете использовать переменную FIELDWIDTHS которая сообщает gawk как разделить ввод с фиксированными границами столбцов. Это экспериментальная особенность. Присвоение FIELDWIDTHS переопределяет использование FS для разделения поля.

Вот пример использования,

 gawk 'BEGIN{ FIELDWIDTHS = "10 10 10" } { s = q = "" for(i=1;i<=NF;i++) { s = $i gsub(/ +/,"",s) s = (length(s) )? s : "-" q = sprintf("%s%s%s",q,(length(q)?OFS:""),s) } print q } ' file