次の形式のデータを含む大きなテキストファイルがあります。
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
答え2
このcolumns
ツールは次のことができます。
$ seq 10 | columns -W 16 -c 3
1 2 3
4 5 6
7 8 9
10
-W 16
線幅を小さく設定するだけです。
columns
Unix標準ツールではありません。それは一部です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-pagination
GNUにのみ適用されるようですが、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" }'