次のようなフォーマットのデータを含む大きなテキストファイルがあります。
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
paste
を使用したソリューション
seq 10 | paste - - -
1 2 3
4 5 6
7 8 9
10
paste
はUnix標準ツールであり、標準では、これが少なくとも12列で機能することが保証されています。
columns
ツールはこれを行うことができます:
$ seq 10 | columns -W 16 -c 3
1 2 3
4 5 6
7 8 9
10
-W 16
は、線の幅を小さい値に設定するだけです。
columns
はUnix標準ツールではありません。 GNU AutoGen の一部です。
より一般的なcolumn
コマンドの一部のバージョンでは、-c
を使用して列数を設定できる場合がありますが、最近のバージョンでは、行幅を文字数で設定するように意味が変更されているようです。
Mpez0がコメントで提案しているpr
もあります。
$ seq 10 | pr -aT3
1 2 3
4 5 6
7 8 9
10
-aT3
は--across --omit-pagination --columns=3
の略です。
pr
はcoreutilsとPOSIXにありますが、-T
/--omit-pagination
はGNU固有のようです。
のようにしてみてください
seq 1 10 | awk '{printf "%40s", $0} !(NR%3) {printf "\n"}'
1 2 3
4 5 6
7 8 9
10
このジョブのツールはrs
( "reshape")です:
$ seq 10 | rs 0 3
1 2 3
4 5 6
7 8 9
10
列セパレーターをタブに変更できます:
$ seq 10 | rs -C 0 3
1 2 3
4 5 6
7 8 9
10
または右揃え:
$ seq 10 | rs -j 0 3
1 2 3
4 5 6
7 8 9
10
rs
はUnix標準ツールではありません。ただし、広く利用できます。 4.2BSDで発明されたので、最近のすべてのBSDでもそうです。 to Debian などのLinuxベースのオペレーティングシステムへの移植があります。
これにより、入力の各行で文字列の幅が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行に3つの40列のエントリが必要な場合は、これを使用できます(40s
から-40s
左揃えのテキストが必要な場合):
awk '{ printf "%40s", $0 } !(NR % 3) { printf "\n" }'
Pythonの使用
#!/usr/bin/python
k=open('filename','r')
p=k.readlines()
for i in range(0,10,3):
print str(p[i:i+3]).replace("[","").replace("]","").replace(",","").replace("\\n","").replace("'","")
出力
1 2 3
4 5 6
7 8 9
10
以下のコマンドで試して、テストして正常に動作した
コマンド
for ((i=0;i<=10;i++)); do awk -v i="$i" 'NR>i && NR<(i+4)' o| Perl -pne "s/\n/ /g";echo -e '\n'; i=$(($i+2)); done
出力
1 2 3
4 5 6
7 8 9
10