私の出力ファイルには次の内容が含まれています。
出力.txt
2020.11.07-22.3.31 INFO - :|FSNAME:|AVAILABLE:|AVAILABILITY
2020.11.07-22.3.31 INFO - :|/opt:|yes:|1.4GB
2020.11.07-22.3.31 INFO - :|/data:|yes:|30GB
上記の値は、output.txt
その変数から加算されて出力されるサイズが異なり、文字に限定することはできません。
column
インストールコマンドはありませんmiller
!
次の方法を使用しましたが、出力は順番になりません
awk '{ gsub(":", " " ) } 1' output.txt
2020.11.07-22.3.31 INFO - |FSNAME |AVAILABLE |AVAILABILITY 2020.11.07-22.3.31 INFO - |/opt |yes |1.4GB 2020.11.07-22.3.31 INFO - |/data |yes |30GB
awk -F ':' '{printf "%-10s%-10s%-10s%-10s\n", $1,$2,$3,$4}' output.txt
2020.11.07-22.3.31 INFO - |FSNAME |AVAILABLE|AVAILABILITY 2020.11.07-22.3.31 INFO - |/opt |yes |1.4GB 2020.11.07-22.3.31 INFO - |/data |yes |30GB
可変サイズのいずれかを出力ファイルに書き込むのに10秒以上かかると、次のようにフォーマットが正しくありません。
出力.txt
2020.11.07-22.3.31 INFO - :|FSNAME:|AVAILABLE:|AVAILABILITY
2020.11.07-22.3.31 INFO - :|/opt:|yessssssss:|1.4GB
2020.11.07-22.3.31 INFO - :|/data:|yes:|30GB
awk -F ':' '{printf "%-10s%-10s%-10s%-10s\n", $1,$2,$3,$4}' output.txt
2020.11.07-22.3.31 INFO - |FSNAME |AVAILABLE|AVAILABILITY
2020.11.07-22.3.31 INFO - |/opt |yessssssss|1.4GB
2020.11.07-22.3.31 INFO - |/data |yes |30GB
問題を解決するのに役立ちます。
答え1
次の2段階の方法では、フィールドの形式を固定列幅で指定する必要があります。
awk -F':\\|' -v OFS='|' 'NR==FNR{for (i=1;i<=NF;i++) {if (length($i)>max[i]) max[i]=length($i);} next;}
{for (i=1;i<=NF;i++) $i=sprintf("%-*s",max[i],$i)}1' output.txt output.txt
これが処理するでしょうoutput.txt
二重(それで引数として2回指定する必要がありますawk
。)
- 最初のステップ(
FNR
ファイルごとのラインカウンタがグローバルラインカウンタと同じ)では、単に各フィールドエントリの最大長を見つけ(配列内のすべてのフィールドをNR
繰り返す)、配列に保存します。$1
$NF
max
sprintf
2番目のパスでは、最大フィールド幅の配列に基づいて決定された固定幅のフィールドの形式を(再)指定します。max
- 入力されたフィールド区切り文字は結合文字シーケンスとして扱われます
:|
(マルチ文字であるため、適切なエスケープを使用)。入力するフィールド区切り文字は正規表現として扱われ、|
特別な意味を持ちます。出力フィールド区切り文字はSingleに設定されます|
。
あなたの例の結果
2020.11.07-22.3.31 INFO - |FSNAME|AVAILABLE|AVAILABILITY
2020.11.07-22.3.31 INFO - |/opt |yes |1.4GB
2020.11.07-22.3.31 INFO - |/data |yes |30GB