如何在bash中“填充”CSV文件?

时间:2012-03-20 18:29:23

标签: linux bash shell

例如,假设我希望有一个包含5列的CSV文件。我怎么能转换

a,b,c,d
d,e,f

a,b,c,d,
d,e,f,,

4 个答案:

答案 0 :(得分:6)

在Awk中很容易:

awk -F, -vOFS=, '{$5=$5}1'

Bash不太难:

IFS=,
while read -a F; do
    for ((i=0; i<5; i++)); do
        F[i]=${F[i]}
    done
    echo "${F[*]}"
done

答案 1 :(得分:4)

awk的示例:

$ awk -F, '{printf("%s,%s,%s,%s,%s\n",$1,$2,$3,$4,$5)}' example.txt
a,b,c,d,
d,e,f,,

$ awk -F, -v OFS=, '{print $1,$2,$3,$4,$5}' example.txt

答案 2 :(得分:2)

我找到了一个GNU sed的解决方案:

sed -r 's/^([^,]*)(,|)([^,]*)(,|)([^,]*)(,|)([^,]*)(,|)$/\1,\3,\5,\7,/'

#             |          |          |          |          ^  ^  ^  ^
#             |          |          |          |          |  |  |  |
#             |__________|__________|__________|__________|  |  |  |
#                        |__________|__________|_____________|  |  |
#                                   |__________|________________|  |
#                                              |___________________|

证明:

echo -e "a,b,c,d\nd,e,f\nx" | sed -r 's/^([^,]*)(,|)([^,]*)(,|)([^,]*)(,|)([^,]*)(,|)$/\1,\3,\5,\7,/'
a,b,c,d,
d,e,f,,
x,,,,

答案 3 :(得分:0)

我非常喜欢的另一种方法是:

gawk '{print $0 ",,,,,"}' a | cut -d \, -f 1-5

我认为它更加简单明了