你需要一个shell脚本来解析csv文件 - 逐行,然后逐字段解析]
该文件将如下所示
X1,X2,X3,X4
Y1,Y2,Y3,Y4
我需要提取这些X1,X2 ....
我写了一个脚本,但如果该行超过一行则会失败..
答案 0 :(得分:40)
我将如何做到这一点。
首先我设置IFS环境变量,告诉read
“,”是字段分隔符。
export IFS=","
鉴于包含您提供的数据的文件“input”,我可以使用以下代码:
cat test | while read a b c d; do echo "$a:$b:$c:$d"; done
快速回顾上面发生的事情。 cat test |
读取文件并将其传递给while
。 while
在do
和done
之间运行代码,而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);