Bash Parse CSV - 格式化数据集

时间:2013-05-02 16:39:42

标签: bash shell unix

我有一个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"

2 个答案:

答案 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)

这是一个紧凑且可读但很糟糕的 + + 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关心换行。