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


11

以下に示すように、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

1
2列はどこですか?
Marc

両方の出力は同じようです。質問の詳細を教えてください。

2
列はどのように定義されますか?名前と番号の間にタブまたは他の文字がありますか?それMichael Rod 3が2列で3列ではないことをどうやって確認できますか?
terdon

2
いいえ、テキストの画像を投稿しないください。私はあなたを助けるためにそのテキストをコピーして貼り付けるつもりでしたが、今はできません。
クサラナンダ

1
mmmintとterdonが言ったことも同じです。たとえば、最長の行の幅を可能にするためにインデントする必要がある最後の列であることを指定できますか?
ジェフシャラー

回答:


18

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

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

"Michael Rod"は2つの列であるため、1つの行が他の行よりも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、最後のフィールドのデータです。私が使用しているスクリプトは、完全な行を印刷する前に、タブ文字を前に付けることによって最後のフィールドのデータを変更するだけです。

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

awk '{ $NF = "@" $NF; print }' file1 | column -t -s '@'
John          1
Peter         2
Michael Rod   3
Su            7
Louise        9
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.