これは、コンパクトで読みやすいがハックなbash + awk +pr
ソリューションで、ランタイムが悪いですが、任意のセットで動作します。awk
段落モードを使用して特定のデータセットを取得し、プロセスpr
置換を使用してそれらを並べて表示するために使用します。
$ cat csv
Dataset1,
ds1foo1
Dataset2,
ds2foo1,ds2bar1
ds2foo2,ds2bar2
Dataset3,
ds3foo1,ds3bar1,ds3quux1
ds3foo2,ds3bar2,ds3quux2
ds3foo3,ds3bar3,ds3quux3
Dataset4,
ds3foo1,ds3bar1,ds3quux1,ds3quuux1
ds3foo2,ds3bar2,ds3quux2,ds3quuux2
ds3foo3,ds3bar3,ds3quux3,ds3quuux3
ds3foo4,ds3bar4,ds3quux4,ds3quuux4
$ ./columnize_paragraphs.sh csv
Dataset1, Dataset2, Dataset3, Dataset4,
ds1foo1 ds2foo1,ds2bar1 ds3foo1,ds3bar1,ds3quux1 ds3foo1,ds3bar1,ds3quux1
ds2foo2,ds2bar2 ds3foo2,ds3bar2,ds3quux2 ds3foo2,ds3bar2,ds3quux2
ds3foo3,ds3bar3,ds3quux3 ds3foo3,ds3bar3,ds3quux3
ds3foo4,ds3bar4,ds3quux4
そしてコード:
#!/bin/bash
get_paragraph_count()
{
awk 'BEGIN{RS=""}END{print NR}' "$1"
}
get_record()
{
awk -v record="$2" 'BEGIN{RS=""}NR==record' "$1"
}
columnize_paragraphs()
{
local file="$1"
local paragraphs="$(get_paragraph_count "${file}")"
local args=
for i in $(seq 1 ${paragraphs}); do
args="${args} <(get_record '${file}' '${i}')"
done
[ -n "${args}" ] && eval "pr -w100 -mt ${args}"
}
for file; do
[ -e "${file}" ] || continue
columnize_paragraphs "${file}"
done
ファイルの外観に応じて、行の折り返しを気にしない場合は、-w
パラメータをいじったり、構築中にpr
a を挿入したりする必要があります。fold
args