Shell脚本通过文件(csv)解析并逐行处理

时间:2010-12-14 13:15:48

标签: shell unix

你需要一个shell脚本来解析csv文件 - 逐行,然后逐字段解析]

该文件将如下所示

X1,X2,X3,X4
Y1,Y2,Y3,Y4

我需要提取这些X1,X2 ....

我写了一个脚本,但如果该行超过一行则会失败..

3 个答案:

答案 0 :(得分:40)

我将如何做到这一点。

首先我设置IFS环境变量,告诉read“,”是字段分隔符。

export IFS=","

鉴于包含您提供的数据的文件“input”,我可以使用以下代码:

cat test | while read a b c d; do echo "$a:$b:$c:$d"; done

快速回顾上面发生的事情。 cat test |读取文件并将其传递给whilewhiledodone之间运行代码,而read返回true。 read从标准输入读取一行,并根据$ IFS的值将其分为变量(“a”,“b”,“c”和“d”)。最后echo只显示我们读取的变量。

这给了我以下输出

X1:X2:X3:X4
Y1:Y2:Y3:Y4
顺便说一句,BASH manual总是很好读。每次阅读时你都会学到新东西。

答案 1 :(得分:3)

因为eykanal提到了AWk和sed,我想我会告诉你如何使用它们。

awk -F, 'BEGIN{OFS="\n"}{$1=$1; print}' inputfile

sed 's/,/\n/' inputfile

然后shell脚本可以处理它们的输出:

awk_or_sed_cmd | while read -r field
do
    do_something "$field"
done

当然,您可以在AWK脚本中进行处理:

awk -F, '{for (i=1;i<=NF;i++) do_something($i)}' inputfile

答案 2 :(得分:0)

  

ls -l <​​/ p>      

vi filename.sh

     

#!bin / sh的

     

回声“INPUT PATTERN”

     

cat&gt;测试   (输入数据并保存)

     猫测试|读取(输入);(例如:“$ a:$ b:$ c:$ d”);

     

完成

     

echo“模式显示为”$ a:$ b:$ c:$ d“\ n”

     

出口(0);