タブが区切り文字であるテキストテーブル(デフォルトでは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.
tbl
nroff
(推測されましたが)テーブル作成をサポートするフロントエンドです。.TS
「テーブルスタート」です。allbox
とても明らかです。各セルの周りにボックスを描画します。LLLL
これは、最初の行のすべてのセルが左揃えであることを意味し、LLLR
4番目のセルがすべての後続の行に対して右揃えであることを意味します。私はこれがサンプル出力から欲しいものだと思います。-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
- すべてのデータを読み、
- メモリおよび/または一時ファイルに保存します。
- 列の幅を計算してから
- すべてのデータを出力します。
お持ちの場合ㅏ たくさんデータが不足すると、一時記憶容量の制限を超えてコマンドが失敗する可能性があります。入力を小さなファイルに分割すると、便利な結果が得られます。
警告:ファイルにT{
またはT}
、またはピリオド(.
)または一重引用符('
)、奇妙な結果が表示されることがあります。
答え2
awk '{$1=$1"|";$2=$2"|";$NF="|"$NF}1' input.txt | awk -F\| 'BEGIN{print "<table border=1>"}{gsub("\\|","</td><td>");print"<tr><td>"$0"</td></tr>"}END{print "</table>"}' > output.html
最初の awk は | で値を区切るために使用されます。
2番目のawkは、値をHTMLテーブルにフォーマットするために使用されます。