Bash - 可変長線の後ろに垂直線を描く

Bash - 可変長線の後ろに垂直線を描く

次の形式のテキストファイルがありますが、行の後に垂直線を追加して数字を追加したいと思います。

c4-1 d e c
c d e c
e-2 f g2
e4 f g2
g8-4\( a-5 g f\) e4 c
g'8\( a g f\) e4 c
c-1 r c2
c4 r c2 

次の方法で行と番号付けを実装しましたwhile-loop

#!/bin/bash

while read -r line; do
    if [ -z "$line" ]; then
        echo
        continue
    fi
    n=$((++n)) \
    && grep -vE "^$|^%" <<< "$line" \
    | sed 's/$/\ \|\ \%'$(("$n"))'/'
done < file

次の出力を取得します。

c4-1 d e c | %1
c d e c | %2
e-2 f g2 | %3
e4 f g2 | %4
g8-4\( a-5 g f\) e4 c | %5
g'8\( a g f\) e4 c | %6
c-1 r c2 | %7
c4 r c2 | %8

今、あなたはコンテンツの垂直配置を追加し、次のような出力を取得したいと思います。

c4-1 d e c            | %1
c d e c               | %2
e-2 f g2              | %3
e4 f g2               | %4
g8-4\( a-5 g f\) e4 c | %5
g'8\( a g f\) e4 c    | %6
c-1 r c2              | %7
c4 r c2               | %8

これは、最長行の行の長さ(ここでは21文字)と空白が追加された各行の行の長さとの間の違いを何らかの形で取得する必要があることを意味します。どうすればいいですか?

ベストアンサー1

ソートされていない行を印刷し、column -tダミー区切り文字を使用して出力形式を指定できます。

#!/bin/bash

while read -r line; do
  if [ -z "$line" ]; then
    echo
    continue
  fi
  printf '%s@| %%%s\n' "$line" "$((++n))"
done < file | column -e -s'@' -t | sed 's/ |/|/'

ここでは@、列の終わりを表示する前にダミー文字を追加しました。最後の|コマンドは、sed前の余分な空白文字を削除します|-e出力に空白行を保持するにはオプションが必要です。

出力:

c4-1 d e c            | %1
c d e c               | %2
e-2 f g2              | %3
e4 f g2               | %4
g8-4\( a-5 g f\) e4 c | %5
g'8\( a g f\) e4 c    | %6
c-1 r c2              | %7
c4 r c2               | %8

おすすめ記事