这是一个紧凑且可读但 hacky 的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
参数 topr
或注入 a 。fold
args