これは私のファイルです:
TLRUIDA CBdms Status DP 6/1/1 DC 6/1/5 0 Y
TLRUIDA CBdms Status DP 6/2/1 DC 6/2/5 0 Y
TLRUIDA CBdms Status DP 6/3/1 DC 6/3/5 0 Y
TLRUIDA CBdms Status DP 6/4/1 DC 6/4/5 0 Y
TLRUIDA CBdms Status DP 6/5/1 DC 6/5/5 0 Y
TLRUIDA CBdms Status DP 6/6/1 DC 6/6/5 0 Y
TLRUIDA CBdms Status DP 6/7/1 DC 6/7/5 0 Y
TLRUIDA CBdms Status DP 6/8/1 DC 6/8/5 0 Y
TLRUIDA CBdms Status DP 6/9/1 DC 6/9/5 0 Y
TLRUIDA CBdms Status DP 6/10/1 DC 6/10/5 0 Y
TLRUIDA CBdms Status DP 6/11/1 DC 6/11/5 0 Y
TLRUIDA CBdms Status DP 6/12/1 DC 6/12/5 0 Y
数字10が開始された後、行からの位置合わせに問題があります。そして、私は以下に述べるフォーマットが欲しいです、
TLRUIDA CBdms Status DP 6/1/1 DC 6/1/5 0 Y
TLRUIDA CBdms Status DP 6/2/1 DC 6/2/5 0 Y
TLRUIDA CBdms Status DP 6/3/1 DC 6/3/5 0 Y
TLRUIDA CBdms Status DP 6/4/1 DC 6/4/5 0 Y
TLRUIDA CBdms Status DP 6/5/1 DC 6/5/5 0 Y
TLRUIDA CBdms Status DP 6/6/1 DC 6/6/5 0 Y
TLRUIDA CBdms Status DP 6/7/1 DC 6/7/5 0 Y
TLRUIDA CBdms Status DP 6/8/1 DC 6/8/5 0 Y
TLRUIDA CBdms Status DP 6/9/1 DC 6/9/5 0 Y
TLRUIDA CBdms Status DP 6/10/1 DC 6/10/5 0 Y
TLRUIDA CBdms Status DP 6/11/1 DC 6/11/5 0 Y
TLRUIDA CBdms Status DP 6/12/1 DC 6/12/5 0 Y
このsedコマンドは、指定された出力を修正します。
sed 's=\(D[CP] *./../.\) =\1=g'
DCおよびDPの後の./../.
の後の1つのスペースを削除します。他の数値も長くなる可能性がある場合、sedはおそらくその仕事に適したツールではありません。
この仕事に適したツールはcolumn
です。列区切り文字は-o
(OSXでは-s
)で指定できます。例:
column -t -o ' ' file
与える
TLRUIDA CBdms Status DP 6/1/1 DC 6/1/5 0 Y
TLRUIDA CBdms Status DP 6/2/1 DC 6/2/5 0 Y
TLRUIDA CBdms Status DP 6/3/1 DC 6/3/5 0 Y
TLRUIDA CBdms Status DP 6/4/1 DC 6/4/5 0 Y
TLRUIDA CBdms Status DP 6/5/1 DC 6/5/5 0 Y
TLRUIDA CBdms Status DP 6/6/1 DC 6/6/5 0 Y
TLRUIDA CBdms Status DP 6/7/1 DC 6/7/5 0 Y
TLRUIDA CBdms Status DP 6/8/1 DC 6/8/5 0 Y
TLRUIDA CBdms Status DP 6/9/1 DC 6/9/5 0 Y
TLRUIDA CBdms Status DP 6/10/1 DC 6/10/5 0 Y
TLRUIDA CBdms Status DP 6/11/1 DC 6/11/5 0 Y
TLRUIDA CBdms Status DP 6/12/1 DC 6/12/5 0 Y
この特定のケースでは、2つ以上のスペースのすべての出現箇所をタブに変更するだけで十分です。
sed 's/ */\t/g' file
より一般的な解決策として、printf
を使用して、各列が正しい幅で印刷されていることを確認できます。これはシェルで直接行うことができます。
$ while read line; do
printf '%-8s%-6s%-7s%-3s%-8s%-3s%-7s%-2s%-2s\n' $line;
done < file
TLRUIDA CBdms Status DP 6/1/1 DC 6/1/5 0 Y
TLRUIDA CBdms Status DP 6/2/1 DC 6/2/5 0 Y
TLRUIDA CBdms Status DP 6/3/1 DC 6/3/5 0 Y
TLRUIDA CBdms Status DP 6/4/1 DC 6/4/5 0 Y
TLRUIDA CBdms Status DP 6/5/1 DC 6/5/5 0 Y
TLRUIDA CBdms Status DP 6/6/1 DC 6/6/5 0 Y
TLRUIDA CBdms Status DP 6/7/1 DC 6/7/5 0 Y
TLRUIDA CBdms Status DP 6/8/1 DC 6/8/5 0 Y
TLRUIDA CBdms Status DP 6/9/1 DC 6/9/5 0 Y
TLRUIDA CBdms Status DP 6/10/1 DC 6/10/5 0 Y
TLRUIDA CBdms Status DP 6/11/1 DC 6/11/5 0 Y
TLRUIDA CBdms Status DP 6/12/1 DC 6/12/5 0 Y
または、任意の入力に対してより安全に:
$ while read a b c d e f g h i; do
printf '%-8s%-6s%-7s%-3s%-8s%-3s%-7s%-2s%-2s\n' "$a" "$b" "$c" "$d" "$e" "$f" "$g" "$h" "$i";
done < file
TLRUIDA CBdms Status DP 6/1/1 DC 6/1/5 0 Y
TLRUIDA CBdms Status DP 6/2/1 DC 6/2/5 0 Y
TLRUIDA CBdms Status DP 6/3/1 DC 6/3/5 0 Y
TLRUIDA CBdms Status DP 6/4/1 DC 6/4/5 0 Y
TLRUIDA CBdms Status DP 6/5/1 DC 6/5/5 0 Y
TLRUIDA CBdms Status DP 6/6/1 DC 6/6/5 0 Y
TLRUIDA CBdms Status DP 6/7/1 DC 6/7/5 0 Y
TLRUIDA CBdms Status DP 6/8/1 DC 6/8/5 0 Y
TLRUIDA CBdms Status DP 6/9/1 DC 6/9/5 0 Y
TLRUIDA CBdms Status DP 6/10/1 DC 6/10/5 0 Y
TLRUIDA CBdms Status DP 6/11/1 DC 6/11/5 0 Y
TLRUIDA CBdms Status DP 6/12/1 DC 6/12/5 0 Y
Perl
のようなものを使用すると、より迅速かつ簡潔にそれを行うことができます。
$ Perl -lane 'printf "%-8s%-6s%-7s%-3s%-8s%-3s%-7s%-2s%-2s\n",@F' file
TLRUIDA CBdms Status DP 6/1/1 DC 6/1/5 0 Y
TLRUIDA CBdms Status DP 6/2/1 DC 6/2/5 0 Y
TLRUIDA CBdms Status DP 6/3/1 DC 6/3/5 0 Y
TLRUIDA CBdms Status DP 6/4/1 DC 6/4/5 0 Y
TLRUIDA CBdms Status DP 6/5/1 DC 6/5/5 0 Y
TLRUIDA CBdms Status DP 6/6/1 DC 6/6/5 0 Y
TLRUIDA CBdms Status DP 6/7/1 DC 6/7/5 0 Y
TLRUIDA CBdms Status DP 6/8/1 DC 6/8/5 0 Y
TLRUIDA CBdms Status DP 6/9/1 DC 6/9/5 0 Y
TLRUIDA CBdms Status DP 6/10/1 DC 6/10/5 0 Y
TLRUIDA CBdms Status DP 6/11/1 DC 6/11/5 0 Y
TLRUIDA CBdms Status DP 6/12/1 DC 6/12/5 0 Y
printf
を使用する利点は、各列に最小列幅を指定できることです。つまり、列の1つがはるかに長い値を持つことができる場合でも、それは機能します。たとえば、いずれかの行の最初のフィールドがaverylongfieldindeed
である場合、最初の列の最小幅を21に設定し、出力を揃えることができます。
$ Perl -lane 'printf "%-21s%-6s%-7s%-3s%-8s%-3s%-7s%-2s%-2s\n",@F' file
averylongfieldindeed CBdms Status DP 6/1/1 DC 6/1/5 0 Y
TLRUIDA CBdms Status DP 6/2/1 DC 6/2/5 0 Y
TLRUIDA CBdms Status DP 6/3/1 DC 6/3/5 0 Y
TLRUIDA CBdms Status DP 6/4/1 DC 6/4/5 0 Y
TLRUIDA CBdms Status DP 6/5/1 DC 6/5/5 0 Y
TLRUIDA CBdms Status DP 6/6/1 DC 6/6/5 0 Y
TLRUIDA CBdms Status DP 6/7/1 DC 6/7/5 0 Y
TLRUIDA CBdms Status DP 6/8/1 DC 6/8/5 0 Y
TLRUIDA CBdms Status DP 6/9/1 DC 6/9/5 0 Y
TLRUIDA CBdms Status DP 6/10/1 DC 6/10/5 0 Y
TLRUIDA CBdms Status DP 6/11/1 DC 6/11/5 0 Y
TLRUIDA CBdms Status DP 6/12/1 DC 6/12/5 0 Y
対照的に、タブの使用は機能しません。
$ sed -e "s/\s\+/\t/g" file
averylongfieldindeed CBdms Status DP 6/1/1 DC 6/1/5 0 Y
TLRUIDA CBdms Status DP 6/2/1 DC 6/2/5 0 Y
TLRUIDA CBdms Status DP 6/3/1 DC 6/3/5 0 Y
TLRUIDA CBdms Status DP 6/4/1 DC 6/4/5 0 Y
TLRUIDA CBdms Status DP 6/5/1 DC 6/5/5 0 Y
TLRUIDA CBdms Status DP 6/6/1 DC 6/6/5 0 Y
TLRUIDA CBdms Status DP 6/7/1 DC 6/7/5 0 Y
TLRUIDA CBdms Status DP 6/8/1 DC 6/8/5 0 Y
TLRUIDA CBdms Status DP 6/9/1 DC 6/9/5 0 Y
TLRUIDA CBdms Status DP 6/10/1 DC 6/10/5 0 Y
TLRUIDA CBdms Status DP 6/11/1 DC 6/11/5 0 Y
TLRUIDA CBdms Status DP 6/12/1 DC 6/12/5 0 Y
ターミナル出力にNice列が必要な場合は、スペースではなく「TAB」と呼ばれる文字を使用する必要があります。すべてのスペースをTABに置き換えるsedワンライナーは次のとおりです
sed -i -e "s/\s\+/\t/g" your_input_file
そのための非常に簡単なコマンドがあります。
tr -s ' ' <input-file >output-file
-s
オプションは、<space>
(またはコマンドラインでそれに続く文字)の出現を削除します