web-dev-qa-db-ja.com

テキストを列にフォーマットする

以下に示すように、2つの列を持つファイルがあります(例)。

ファイル1:

John 1
Peter 2
Michael Rod 3
Su 7
Louise 9

これをフォーマットする必要があり、予想される出力は次のようになります。

ファイル1:

John        1
Peter       2
Michael Rod 3
Su          7
Louise      9
11
Ram

入力が2列のみだった場合、column -tを使用することをお勧めします。 columnユーティリティは任意の数のスペースまたはタブを列の区切り文字として扱うため、これはここではまったく機能しません。

$ column -t file1
John     1      
Peter    2      
Michael  Rod  3 
Su       7      
Louise   9      

"Michael Rod"は2つの列であるため、単一の行は他の行よりも1列多く、出力がめちゃくちゃになります。

これを回避するには、最後の列の前にタブ文字を挿入し、columnを区切り文字として(のみ)使用させます。

$ awk '{ $NF = "\t" $NF; print }' file1 | column -t -s $'\t'
John          1
Peter         2
Michael Rod   3
Su            7
Louise        9

Awkでは、NFはフィールド(列)の数であり、$NFは最後のフィールドのデータです。私が単純に使用しているスクリプトmodify完全な行を印刷する前に、タブ文字を前に付けることによって最後のフィールドのデータ。

シェルが$'\t'を理解できない場合は、データの一部ではない別の文字を選択できます。

awk '{ $NF = "@" $NF; print }' file1 | column -t -s '@'
John          1
Peter         2
Michael Rod   3
Su            7
Louise        9
18
Kusalananda