Bash读取CSV 文件

CSV文件是使用逗号作为分隔符的文本文件,CSV文件以纯文本格式存储数据,文件的每一行都是一条数据记录。

我们可以使用bash中的while循环来读取CSV文件。IFS变量设置分隔符为,(逗号)。read命令读取每一行并将数据存储到每个字段中。

一个简单的实例 Link to heading

st.sh文件内容如下:

while IFS=, read -r fd1 fd2
do
    echo "$fd1 and $fd2"
done < input.csv

我们来运行下st.sh试试:

alair@op36 MINGW64 ~/Documents
$ cat input.csv
bob,18
alair,23
kim,32

alair@op36 MINGW64 ~/Documents
$ sh ./st.sh
bob and 18
alair and 23
kim and 32

处理丢失的字段 Link to heading

#!/bin/bash
missing=false
while IFS=, read -r fd1 fd2
do
	if [ "$fd1" == "" ]
	then
		echo "field1 is empty or no value set"
		missing=true
   	elif [ "$fd2" == "" ]
	then
		echo "field2 is empty or no value set"
		missing=true
	else
		echo "$fd1 and $fd2"
	fi
done < input.csv
if [ $missing ]
then
	echo "WARNING: Missing values in a CSV file. Operation failed!"
	exit 1
else
	echo "CSVfile read successfully!"
fi

bash解析csv文件 Link to heading

再来一个复杂点的实例。

rd.sh文件内容如下:

INPUT=domain-report.csv
OLDIFS=$IFS
IFS=','
[ ! -f $INPUT ] && { echo "$INPUT file not found"; exit 99; }
while read DomainName Visits Clicks CTR EPC

do
	echo "DomainName : $DomainName"
	echo "Visits : $Visits"
	echo "Clicks : $Clicks"
	echo "CTR : $CTR"
	echo "EPC : $EPC"
done < $INPUT
IFS=$OLDIFS

来看看运行rb.sh的结果。

alair@op36 MINGW64 ~/Documents
$ cat domain-report.csv
DomainName,Visits,Clicks,CTR,EPC
regex.in,731,70,10.64,0.05
ciux.org,294,1,0.41,0.39
ymqd.net,187,0,0,0
ustv.xyz,184,65,46.1,0.06
alair.cn,165,0,0,0
smdm.top,148,0,0,0
bwl.ink,144,0,0,0
prettypussy.xyz,129,0,0,0
gfwlist.cn,106,0,0,0
blbl.dev,101,0,0,0
linuxuc.com,88,0,0,0
les.moe,84,0,0,0

alair@op36 MINGW64 ~/Documents
$ sh ./rd.sh
DomainName : DomainName
Visits : Visits
Clicks : Clicks
CTR : CTR
EPC : EPC
DomainName : regex.in
Visits : 731
Clicks : 70
CTR : 10.64
EPC : 0.05
DomainName : ciux.org
Visits : 294
Clicks : 1
CTR : 0.41
EPC : 0.39
DomainName : ymqd.net
Visits : 187
Clicks : 0
CTR : 0
EPC : 0
DomainName : ustv.xyz
Visits : 184
Clicks : 65
CTR : 46.1
EPC : 0.06
DomainName : alair.cn
Visits : 165
Clicks : 0
CTR : 0
EPC : 0
DomainName : smdm.top
Visits : 148
Clicks : 0
CTR : 0
EPC : 0
DomainName : bwl.ink
Visits : 144
Clicks : 0
CTR : 0
EPC : 0
DomainName : prettypussy.xyz
Visits : 129
Clicks : 0
CTR : 0
EPC : 0
DomainName : gfwlist.cn
Visits : 106
Clicks : 0
CTR : 0
EPC : 0
DomainName : blbl.dev
Visits : 101
Clicks : 0
CTR : 0
EPC : 0
DomainName : linuxuc.com
Visits : 88
Clicks : 0
CTR : 0
EPC : 0
DomainName : les.moe
Visits : 84
Clicks : 0
CTR : 0
EPC : 0

awk处理csv文件 Link to heading

除了上述方法,其实awk也可以进行文本处理,以下为awk处理CSV文件的例子:

alair@op36 MINGW64 ~/Documents
$ awk -F',' '{print $1 ":" $2}' ./input.csv
bob:18
alair:23
kim:32