2016-03-20 8 views
0

grepでは何も問題は見つかりませんでしたが、割り当ては基本的にデータを取り出して書式設定し、複数行の表の列として表示しています。今では、基本的な知識がawksedしかないので、何も狂ってはいけません。今私は興味:grepまたはawkまたはsedでテーブルにテキストを書式設定する

Jake 
0001 
Bob 
0002 
Kim 
0003 

をし、それが何かこの

#  Name LD # 
--- ---- ---- 
    1 Jake 0001 
    2 Bob 0002 
    3 Kim 0003 

はまた、それをあるようにしたい:grepから私の出力を取ると、例えば私が得るようにフォーマットする方法がありますあなたの行の各部分を説明することが可能であり、また、私が扱う大きなレコードを持っていれば、それを拡張可能にすることが可能ですか?

+0

ようこそスタックオーバーフロー。すぐに[About]ページを読んで、MCVE([MCVE])について読んでください。どのレコードが新しいレコードを開始するのかをどのように知っていますか?レコードあたりのフィールド(行)の数は厳密に固定されていますか、「Joe」の後ろに「Sue」が付いていますか?どの列見出しを適用するのかはどのように分かりますか?あなたは 'Ozymandias'がレコード3000のような名前のリストに登場するのを許可する必要がありますか?他の人はすべて3文字か4文字ですか?リストされたツールのうち、awkは明らかな候補です。アルゴリズムを指定できる限り、問題に対処できます。しかし、あなたの要件はまだ不明です。 –

+0

私はgrepを使って各レコードを引き出す方法に基づいて、見出しがプロジェクトに割り当てられているので、基本的にはそれらを順番にリストアップしています。 – NewEffect

答えて

1

grep出力に一致するコントロールロジックを定義(または特定)する必要があります。あなたは、私は次のことを前提として与えたものから派生

  • 見出しが最初の列がある書式設定
    (入力から推定されていない)
  • に固有のものである一定のテキストです序数は、入力からのレコードは、その後すべての数字

列folloによって識別される1つ

  • 始まりますあなたはより多くのレコード項目を含める場合(複数の列につながる)

    BEGIN { 
        # initialize ordinal 
        ordinal=1; 
        # print heading 
        printf "%-3s %5s %4s\n", "#", "Name", "LD #" 
    } 
    # match trigger line for output 
    /^[0-9]+$/ { printf "%3d %5s %4s\n", ordinal++, label, $1; 
          # cleanou label - not necessary for single data item case 
          # we are done with this input line 
          next; 
    } 
    # collect data item 
    { 
        label=$1; 
        # we are done with this input line 
        next; 
    } 
    

    あなたが先行する列の値に遭遇されているかどうかを確認するかもしれない:翼awkスクリプトは、書式設定を行います。

    また、レコード内のどの列にあるかを示すカウンタを使用するだけでも可能です。

    次にあなたが例えばを使用することができます。:

    BEGIN { 
        # initialize ordinal 
        ordinal=1; 
        column=0; 
        # print heading 
        printf "%-3s %5s %4s\n", "#", "Name", "LD #" 
    } 
    # match trigger line for output 
    /^[0-9]+$/ { printf "%3d (%d)", ordinal++, column; 
          for (i=0; i < column; i++) { 
           printf " %s", data[i]; 
           data[i] = ""; 
          } 
          printf "\n"; 
          # we are done with this input line 
          column=0; 
          next; 
    } 
    # collect data item 
    { 
        data[column++]=$1; 
        if (length($1) > max[column]) { 
         max[column]=length($1); 
        } 
        # we are done with this input line 
        next; 
    } 
    
    END { 
        for (i=0; i< length(max); i++) { 
         printf "Col %d: %d\n", i, max[i]; 
        } 
    } 
    

    私はまた、列(文字数)の大きさを決定する方法が含まれています。

  • +0

    すばらしい仕事今、jakeの代わりにjaskson、jake D. howこのコードで可能であれば名前の下に置くことができるでしょう – NewEffect

    +0

    あなたは、列の適切なサイズを参照していますか?これは、printf形式の数値のタスクです。これを幅の広い列に合わせるには、2つの方法に従います。適切な幅を先に推測し、値を使用します。または、サイズを決定する(そしてレコードを構築する)2番目のパスを実行し、フォーマットを実行する2番目のパスを実行します。 – rpy

    +0

    OKクールなら、おそらく2passの実行方法はわかりませんが、すばやく質問すると、長さを推測することになります。だから、あなたは1ジャクソンジャックd 0001の紙グレード4.000の本のようになるので、8列をしたいとしましょう。それぞれのために、印刷中にそれぞれに十分な文字を追加するだけでいいですか、別の変数を選択する必要がありますか?これらの項目は変数の中にあることを覚えておいてください。まだawkを学んでいる紛らわしい質問 – NewEffect

    関連する問題