整数行を複数列出力に変換

整数行を複数列出力に変換

ファイルから入力を受け取り、数値の行と列が並べ替えられた順序で含まれるリストを生成しようとしています。これは後で印刷可能な文書を生成するために使用されるため、現在Excelで手動で使用する手順を置き換えることができます。

生データは1から20000の整数です。仮定:

1 2 3 4 5 6 7 8 ...

または

1
2
3
4
5

リストは数字でソートされ、スペースで区切られます。 (オプション)目標を達成するのに役立つ場合は、\ nまたはその他の項目で値を区切ることができます。

列数は7でなければなりませんが、後で直接変更できる可能性が高いです。

私が望む出力:

1 40 80
2 41 81 
3 42 82 
4 43 83

unix.seの問題、SFに関するその他の提案、列のマニュアルページ、fmlなどを読んでいる間にこれを理解しようとしました。

for value in $(cat /tmp/list); do      printf "%-8s\n" "${value}"; done|column -x

出力(単純化、タブ間):

1 2 3 4
5 6 7 8
...

次に試してみるのはServerfaultの提案です。

cat /tmp/list |fmt |column -t

出力:

1    2    3    4    5 
6    7    8    9    10

元の解決策だけでなく(助けになるでしょうが)このプロセスを理解しながら、問題が何であるかを理解したいと思います。

答え1

echo {1..20000} | tr " " "\n" | sort -n | pr -T3 -s" " -l 6667

出力:

1 6668 13335
2 6669 13336
3 6670 13337
4 6671 13338
5 6672 13339
6 6673 13340
7 6674 13341
8 6675 13342
9 6676 13343
10 6677 13344
11 6678 13345

ファイルでテストするには:

tr " " "\n" < file | sort -n | pr -T3 -s" " -l 6667

20,000個の数字がすべて1行にあるのか、1列にあるのかは重要ではありません。

答え2

入力が改行で区切られた数字で構成されているとします。たとえば、次のようになります。

1
2
3
...

sed列に入れる簡単なスクリプトは次のとおりです。

$ sed -n '{N;N;N;N;N;N;s/\n/\t/g;p}'

スクリプトが行を見つけたら、さらにN;N;N;N;N;N6行()をバッファに読み込み、バッファ内の各改行文字をタブ文字(s/\n/\t/g)で置き換えてからバッファ(p)を印刷します。結果:

1    2    3    4    5    6    7
8    9    10   11   12   13   14
...

メモ:入力の行数は7の倍数でなければならず、残りの項目はすべて削除されます。

関連情報