我有一个csv,格式如下
Dataset1,
…
…
Dataset2,
..
..
Dataset3,
所有数据集都用空行分隔。我希望我的bash脚本将文件的格式更改为
Dataset1 Dataset2 Dataset3
... … …
… … …
… … …
这是我的剧本,非常感谢任何帮助或指导
#!/bin/bash
input="/path/to/csv/file/file.cvs"
while IFS=',' read -r f1 f2 f3; do
if [ -z "$f1 $f2 $f3" ]; then
awk 'BEGIN{getline to_add < "$f1 $f2 $f3"}{print $0,to_add}' f
fi
echo "$f1 $f2 $f3"
done < "$input"
答案 0 :(得分:0)
以下纯shell(没有嵌入的awk / perl)将起作用。但有局限性。只有在每组中具有相同数量的记录才能正常工作。要处理不同的数字,您需要维护每组中的记录数,并根据需要嵌入emty记录,,,,,,,
。
set -u
ROW=0
SET=1
MAXROW=0
while read LINE
do
if [ -z "$LINE" ]
then
# New data set
if [ $ROW -gt $MAXROW ]
then
MAXROW=$ROW
fi
ROW=0
SET=$(($SET+1))
elif [ $SET -eq 1 ]
then
DATA[$ROW]="$LINE"
ROW=$(($ROW+1))
else
DATA[$ROW]="${DATA[$ROW]},$LINE"
ROW=$(($ROW+1))
fi
done
if [ $ROW -gt $MAXROW ]
then
MAXROW=$ROW
fi
ROW=0
while [ $ROW -lt $MAXROW ]
do
echo "${DATA[$ROW]}"
ROW=$(($ROW+1))
done
答案 1 :(得分:0)
这是一个紧凑且可读但很糟糕的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
进行游戏,或者在构建fold
期间注入args
关心换行。