単一列を3列に変換するには?

単一列を3列に変換するには?

次の形式のデータを含む大きなテキストファイルがあります。

1
2
3
4
5
6
7
8
9
10

私はそれを次のように変換しようとしています:

1           2             3
4           5             6
7           8             9
10

私は試しましたawk

'{ if (NR%2) {printf "%40s\n", $0} else {printf "%80s\n", $0} }' file.txt

答え1

ソリューション paste

seq 10 | paste - - -
1       2       3
4       5       6
7       8       9
10

paste少なくとも12列で動作することを保証するUnix標準ツールです。

答え2

このcolumnsツールは次のことができます。

$ seq 10 | columns -W 16 -c 3
1     2     3
4     5     6
7     8     9
10

-W 16線幅を小さく設定するだけです。

columnsUnix標準ツールではありません。それは一部ですGNU自動生成

より一般的なcolumnコマンドの一部のバージョンでは列数を設定するために使用できますが、-c最新バージョンでは行幅を文字数に設定するように意味が変更されているようです.

またpr、mpez0がコメントで提案したように:

$ seq 10 | pr -aT3
1           2           3
4           5           6
7           8           9
10

-aT3うん、短縮--across --omit-pagination --columns=3

pr-T/は--omit-paginationGNUにのみ適用されるようですが、coreutilsとPOSIXにもあります。

答え3

次のことを試してください

seq 1 10 | awk '{printf "%40s", $0} !(NR%3) {printf "\n"}'
                                       1                                       2                                       3
                                       4                                       5                                       6
                                       7                                       8                                       9
                                      10

答え4

これにより、各入力行の文字列幅が40、80、120の間で交互に表示されます。

awk '{ m = (NR-1) % 3; i = (m+1) * 40; printf "%*s\n", i, $0 }'

可変的な:

  • m- 行番号モジュロ3(例0、、、1繰り返し2
  • i- 与えられたm値のインデント

他の指示なしに、printf入力の各行が独自の出力行にフォーマットされ、各行が使用可能なスペースに右揃えされるように、独自の形式を使用して進みます。

例のように、1行に40列の項目が3つある場合は、コードの代わりにこのオプションを使用できます(テキストを左揃えにするにはこのオプションに変更)40s-40s

awk '{ printf "%40s", $0 } !(NR % 3) { printf "\n" }'

関連情報