2017-09-16 4 views
0

私は出力の行を持っています最終的な書式を変更するコマンドにパイプしたいと思います。すべての行で文字の均等化

私は各行を見て、特定の文字の最大数を持つ人を決定しようとしています%。次に、すべての行に同じ番号の%があることを確認したいので、行末に多くの%が追加されているだけです。パイプされる例示的な入力:

1 2 3 4 
1 2 %x 4 
%r %c %s 4 
1 2 3 4 

出力:

1 2 3 4 %z %z %z 
1 2 %x 4 %z %z 
%r %c %s 4 
1 2 3 4 %z %z %z 

まただけアプリオリ最大とちょうどパッドその数の列を有することが許容されるであろう。私は、もしあなたの最大値よりもその行の文字数が多い行があると、これが壊れると思います。

答えて

1

perlのこれには良いです:

perl -lne ' 
    push @lines, $_; $n = tr/%/%/; push @n, $n; $max = $n if $n > $max 
    } END { 
    print $lines[$_] . " %z" x ($max - $n[$_]) for (0 .. $#lines); 
' file 
1

あなたは%として入力フィールドセパレータを使用してこの問題を解決するためにawkを使用することができます。

awk -F% -v n=3 '{rn = n+1 -NF; for (i=1; i<=rn; i++) $0 = $0 OFS "%z"} 1' file 

1 2 3 4 %z %z %z 
1 2 %x 4 %z %z 
%r %c %s 4 
1 2 3 4 %z %z %z 
1

AWK(%発生の任意の数の)溶液:

awk 'NR==FNR{ r = gsub("%","",$0); if(r>max) max=r; a[NR]=r; next } 
    a[FNR] < max{ for(i=max-a[FNR];i--;) $0=$0" %z" }1' file file 

  • r - 最終的にはすべての行


ため%文字出現の最大数を格納する出力 - %文字

  • maxの交換回数:

    1 2 3 4 %z %z %z 
    1 2 %x 4 %z %z 
    %r %c %s 4 
    1 2 3 4 %z %z %z 
    
  • 1
    $ cat file | 
    awk -F'%' ' 
        { maxNF = (maxNF>NF ? maxNF : NF); a[NR]=$0; nf[NR]=NF } 
        END { 
         for (i=1; i<=NR; i++) { 
          printf "%s", a[i] 
          for (j=nf[i]+1; j<=maxNF; j++) { 
           printf "%s%sz", OFS, FS 
          } 
          print "" 
         } 
        } 
    ' 
    1 2 3 4 %z %z %z 
    1 2 %x 4 %z %z 
    %r %c %s 4 
    1 2 3 4 %z %z %z 
    

    cat file |あなたはI would like to pipe into commands...

    言ったので、パイプで連結された入力を発揮することは明らかにのみ存在し、
    関連する問題