awk TSVテーブルをグリッドテーブルに変換する[閉じる]

awk TSVテーブルをグリッドテーブルに変換する[閉じる]

タブが区切り文字であるテキストテーブル(デフォルトではTSVファイルなど)を、すべての境界線(内側と外側)に行があり、テキストの折り返しがあるグリッドテーブルに変換したいと思います。

以下は入力です

   TrackId         peerId                                             Cause                                     Count
ESS_RSM         pra4.pra.pnc100.tpp240.6pppsetwork.prg             40009 Response is not received from server   1401
ESS_RSM         pra5.pra.pnc100.tpp240.6pppsetwork.prg             40009 Response is not received from server   1398
ESS_RSM         pra3.pra.pnc100.tpp240.6pppsetwork.prg             40009 Response is not received from server   1347
ESS_RSM         pra1.pra.pnc100.tpp240.6pppsetwork.prg             40009 Response is not received from server   1412
ESS_RSM         pra2.pra.pnc100.tpp240.6pppsetwork.prg             40009 Response is not received from server   1355
ESS_RSM         pra6.pra.pnc100.tpp240.6pppsetwork.prg             40009 Response is not received from server   1416

大きなスペースはタブで、「サーバーから応答を受け取っていません」のスペースはスペースです。出力は次のようになります。

 ┌────────┬────────────────────────────────────────┬────────────────────────────┬────────┐
 │TrackId │ peerId                                 │ Cause                      │ Count  │
 ├────────┼────────────────────────────────────────┼────────────────────────────┼────────┤
 │ESS_RSM │ pra4.pra.pnc100.tpp240.6pppsetwork.prg │ 40009 Response is not      │  1,401 │
 │        │                                        │ received from server       │        │
 ├────────┼────────────────────────────────────────┼────────────────────────────┼────────┤
 │ESS_RSM │ pra5.pra.pnc100.tpp240.6pppsetwork.prg │ 40009 Response is not      │  1,398 │
 │        │                                        │ received from server       │        │
 ├────────┼────────────────────────────────────────┼────────────────────────────┼────────┤
 │ESS_RSM │ pra3.pra.pnc100.tpp240.6pppsetwork.prg │ 40009 Response is not      │  1,347 │
 │        │                                        │ received from server       │        │
 ├────────┼────────────────────────────────────────┼────────────────────────────┼────────┤
 │ESS_RSM │ pra1.pra.pnc100.tpp240.6pppsetwork.prg │ 40009 Response is not      │  1,412 │
 │        │                                        │ received from server       │        │
 ├────────┼────────────────────────────────────────┼────────────────────────────┼────────┤
 │ESS_RSM │ pra2.pra.pnc100.tpp240.6pppsetwork.prg │ 40009 Response is not      │  1,355 │
 │        │                                        │ received from server       │        │
 ├────────┼────────────────────────────────────────┼────────────────────────────┼────────┤
 │ESS_RSM │ pra6.pra.pnc100.tpp240.6pppsetwork.prg │ 40009 Response is not      │  1,416 │
 │        │                                        │ received from server       │        │
 └────────┴────────────────────────────────────────┴────────────────────────────┴────────┘

または多分

TrackId │ peerId                         │ Cause                                │ Count   │
────────┼────────────────────────────────┼──────────────────────────────────────┼─────────┤
        │ pra4.pra.pnc100.tpp240.6pppset │ 40009 Response is not received from  │         │
ESS_RSM │ work.prg                       │ server                               │   1,401 │
────────┼────────────────────────────────┼──────────────────────────────────────┼─────────┤
        │ pra5.pra.pnc100.tpp240.6pppset │ 40009 Response is not received from  │         │
ESS_RSM │ work.prg                       │ server                               │   1,398 │
────────┼────────────────────────────────┼──────────────────────────────────────┼─────────┤
        │ pra3.pra.pnc100.tpp240.6pppset │ 40009 Response is not received from  │         │
ESS_RSM │ work.prg                       │ server                               │   1,347 │
────────┼────────────────────────────────┼──────────────────────────────────────┼─────────┤
        │ pra1.pra.pnc100.tpp240.6pppset │ 40009 Response is not received from  │         │
ESS_RSM │ work.prg                       │ server                               │   1,412 │
────────┼────────────────────────────────┼──────────────────────────────────────┼─────────┤
        │ pra2.pra.pnc100.tpp240.6pppset │ 40009 Response is not received from  │         │
ESS_RSM │ work.prg                       │ server                               │   1,355 │
────────┼────────────────────────────────┼──────────────────────────────────────┼─────────┤
        │ pra6.pra.pnc100.tpp240.6pppset │ 40009 Response is not received from  │         │
ESS_RSM │ work.prg                       │ server                               │   1,416 │
────────┴────────────────────────────────┴──────────────────────────────────────┴─────────┘

以下のコードを試しましたが、出力は私が望むものとは異なります。

awk '{print "<table>"} {print "<tr>"; for(i=1;i<=NF;i++) print "|" $i "|";print "|"} END {PRINT "|"}' file

ベストアンサー1

いくつかの古いUnixユーティリティを使用して、

#!/bin/sh
{
        printf '%s\n' '' .TS 'allbox;LLLL,LLLR.'
        awk -v sq="'" '
            BEGIN { FS = OFS = "\t"; fmt = "%" sq "d" }
            NR==1 { print }
            NR>1  {
                        print $1, "T{"
                        print          $2
                        print             "T}", "T{"
                        print                        $3
                        print                           "T}", sprintf(fmt, $4)
                  }
            ' "$@"
        printf '%s\n' .TE '.pl 0'
} | tbl | nroff 2> /dev/null

説明する:

  • nroff古代のUnixはテキストプロセッサです。例えば、
    Lorem ipsum dolor sit amet, consectetur adipiscing elit,
    sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
    Ut enim ad minim veniam,
    quis nostrud exercitation ullamco laboris nisi
    ut aliquip ex ea commodo consequat.
    Duis aute irure dolor in reprehenderit
    in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
    Excepteur sint occaecat cupidatat non proident,
    sunt in culpa qui officia deserunt mollit anim id est laborum.
    
    入力と生産
    Lorem  ipsum  dolor sit amet, consectetur adipiscing elit, sed do
    eiusmod tempor incididunt ut labore et dolore magna  aliqua.   Ut
    enim  ad  minim veniam, quis nostrud exercitation ullamco laboris
    nisi ut aliquip ex ea commodo consequat.  Duis aute  irure  dolor
    in  reprehenderit in voluptate velit esse cillum dolore eu fugiat
    nulla pariatur.  Excepteur sint occaecat cupidatat non  proident,
    sunt in culpa qui officia deserunt mollit anim id est laborum.
    
    出力として。
  • tblnroff(推測されましたが)テーブル作成をサポートするフロントエンドです。
  • .TS「テーブルスタート」です。
  • allboxとても明らかです。各セルの周りにボックスを描画します。
  • LLLLこれは、最初の行のすべてのセルが左揃えであることを意味し、 LLLR4番目のセルがすべての後続の行に対して右揃えであることを意味します。私はこれがサンプル出力から欲しいものだと思います。
  • -v sq="'"sq 一重引用符で囲まれた値で名前付き変数を作成します。これは、awkプログラムで一重引用符を使用する方法の1つです。GNU Awkユーザーガイド
  • FS入力がTSVなので、タブに設定します。OFS期待どおりにタブに設定します  tbl(デフォルト)。
  • fmt = "%" sq "d"fmtに設定すると、千単位の区切り記号を持つ整数を出力する%'dために使用できます[s]printf 。 (あなたが見せたので、これをしたいとします。)
  • 最初の行(タイトル)を変更せずに渡します。
  • 他のすべての行(データ)の場合は、テキストの折り返しに  T{マーカーT}を使用します。 (最初と4番目の列には短い文字列しか含まれていないため、2番目と3番目の列だけが必要であるとします。)3桁ごとにカンマを挿入して値を印刷します。$2$3$4
  • .TE「テーブルの終わり」です。
  • .plページの長さです。パッチワークです。デフォルトでは、nroff出力は空白行で埋められ、出力全体が66行の倍数になります。ページ長を0に設定すると、これを抑制できます。
  • 上記の(printf、  awk および  printf)出力はtbl およびにパイプされますnroff
  • stdoutが合理的であっても、エラーメッセージに問題があり、stderrをbitbucketに送信しました。奇妙な結果が出たら、最初にstderrリダイレクトを削除してエラーメッセージを見てください(それほど役に立たないかもしれません)。

指示する:

  • 上記のコードをファイルに入れてみてください。たとえばと呼んでくださいgman
  • する
    $ chmod +x gman
    
    実行可能にしてください。
  • データがファイル(名前付きなどshap)にある場合は、次のようにします。
    $ ./gman shap
    
    出力をファイルにリダイレクトできます。
    $ ./gman shap > grid_table
    
  • 最初の列のすべてのデータを取得すると、これは実際には入力ファイルにタブがないことを意味します(空白のみ)。スペース(スペース)をタブに置き換えるように編集します。
  • データベースクエリなどの他のプログラムからデータを生成/生成する場合は、次のことができます。
    $ db_query > tmp
    $ ./gman tmp
    
    rm tmp他のタスクを実行するために必要でない場合はオプション)または単に
    $ db_query | ./gman
    
  • gmanファイルを検索パスのディレクトリに移動(またはコピー)する場合は、単に入力するだけですgman(必要ありません)。./)。一つある たくさんこれに関するドキュメントがあるので、検索すると簡単に見つけることができます。

たとえば、質問に表示されている入力に対して次のようになります。

┌───────────┬─────────────────────────────────┬───────────────┬───────┐
│   TrackId │ peerId                          │ Cause         │ Count │
├───────────┼─────────────────────────────────┼───────────────┼───────┤
│ESS_RSM    │ pra4.pra.pnc100.tpp240.6pppset‐ │ 40009     Re‐ │ 1,401 │
│           │ work.prg                        │ sponse is not │       │
│           │                                 │ received from │       │
│           │                                 │ server        │       │
├───────────┼─────────────────────────────────┼───────────────┼───────┤
│ESS_RSM    │ pra5.pra.pnc100.tpp240.6pppset‐ │ 40009     Re‐ │ 1,398 │
│           │ work.prg                        │ sponse is not │       │
│           │                                 │ received from │       │
│           │                                 │ server        │       │
├───────────┼─────────────────────────────────┼───────────────┼───────┤
│ESS_RSM    │ pra3.pra.pnc100.tpp240.6pppset‐ │ 40009     Re‐ │ 1,347 │
│           │ work.prg                        │ sponse is not │       │
│           │                                 │ received from │       │
│           │                                 │ server        │       │
├───────────┼─────────────────────────────────┼───────────────┼───────┤
│ESS_RSM    │ pra1.pra.pnc100.tpp240.6pppset‐ │ 40009     Re‐ │ 1,412 │
│           │ work.prg                        │ sponse is not │       │
│           │                                 │ received from │       │
│           │                                 │ server        │       │
├───────────┼─────────────────────────────────┼───────────────┼───────┤
│ESS_RSM    │ pra2.pra.pnc100.tpp240.6pppset‐ │ 40009     Re‐ │ 1,355 │
│           │ work.prg                        │ sponse is not │       │
│           │                                 │ received from │       │
│           │                                 │ server        │       │
├───────────┼─────────────────────────────────┼───────────────┼───────┤
│ESS_RSM    │ pra6.pra.pnc100.tpp240.6pppset‐ │ 40009     Re‐ │ 1,416 │
│           │ work.prg                        │ sponse is not │       │
│           │                                 │ received from │       │
│           │                                 │ server        │       │
└───────────┴─────────────────────────────────┴───────────────┴───────┘

出力として。列(たとえば、3番目の列)をより広くするいくつかのヒントがあります。知りたいことを教えてください。

警告:このコマンドを実行するtbl と nroff

  1. すべてのデータを読み、
  2. メモリおよび/または一時ファイルに保存します。
  3. 列の幅を計算してから
  4. すべてのデータを出力します。

お持ちの場合ㅏ たくさんデータが不足すると、一時記憶容量の制限を超えてコマンドが失敗する可能性があります。入力を小さなファイルに分割すると、便利な結果が得られます。

警告:ファイルにT{またはT}、またはピリオド(.)または一重引用符(')、奇妙な結果が表示されることがあります。

おすすめ記事