web-dev-qa-db-ja.com

1つの列を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
5
Kalpesh Bhoj

pasteを使用したソリューション

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

paste はUnix標準ツールであり、標準では、これが少なくとも12列で機能することが保証されています。

41
Paulo Tomé

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固有のようです。

8
JoL

のようにしてみてください

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

このジョブのツールは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ベースのオペレーティングシステムへの移植があります。

6
Toby Speight

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

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

変数:

  • m-3を法とする行番号(つまり、012繰り返し)
  • i-指定されたmの値のインデント

他の命令がない場合、私は引き続き独自のprintfフォーマットを使用して、入力の各行が出力の独自の行としてフォーマットされ、使用可能なスペースで右揃えされるようにしました。

コードではなく、例に示すように、1行に3つの40列のエントリが必要な場合は、これを使用できます(40sから-40s左揃えのテキストが必要な場合):

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

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
0

以下のコマンドで試して、テストして正常に動作した

コマンド

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 
0