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

[root@mysvr ~]# ps -ef | grep sleep
root      1362  1338  0 17:23 pts/0    00:00:00 sleep 12h
root      1393  1367  0 17:24 pts/1    00:00:00 grep sleep

.oh-my-zsh [118669] не используется ничем, кроме oh-my-zsh. Если вы используете bash, вы можете просто удалить его.

Инструкция [118670] [118671] говорит вам, что нужно выполнить команду [118672] uninstall_oh_my_zsh[118673]. Это функция, которую можно вызвать из zsh, запустив oh-my-zsh. Если вы не запускаете oh-my-zsh, вы можете запустить [118674]tools/uninstall.sh[118675], но все, что она делает, это:
remove [118992]~/.oh-my-zsh[118993], что вы собирались сделать в любом случае;

switch your login shell to bash, что вы уже сделали;

restore your old [118994]~/. zshrc[118995], которого у вас не было, если вы никогда не использовали zsh без oh-my-zsh.

~/. Вы также можете использовать zsh без oh-my-zsh.[118133].

1
23.10.2014, 01:17
4 ответа

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
4
27.01.2020, 23:13

Awk way

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
1
27.01.2020, 23:13

, которые работали для меня:

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' вход Удаляет ведущее пространство, если присутствуют
  • TR-S » : blank:] "", ": заменяет все пространства запятой
  • ... : использует разделитель , и печатает значения или - - Если значение пусто.
2
27.01.2020, 23:13

Если у вас есть 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
0
27.01.2020, 23:13

Теги

Похожие вопросы