使用awk读取csv文件时忽略空间

时间:2016-01-18 09:41:32

标签: csv awk space

我是shell脚本的新手,并建议通过电子邮件发送以下数据

tb.csv文件中的数据

09,01,14-Jan-2016 02:39:27,14-Jan-2016 02:40:25,14-Jan-2016 04:54:34,14-Jan-2016 07:54:54,,,01/16/2016
10,01,15-Jan-2016 02:38:45,15-Jan-2016 02:40:28,15-Jan-2016 03:50:50,15-Jan-2016 06:21:09,,,01/17/2016
11,01,,,,,,,01/19/2016
12,01,,,,,,,01/21/2016
13,01,,,,,,,01/23/2016

制作脚本

我已确定将每个值存储在tb.csv文件中,作为以下单独的变量

awk -F, 'NR==18 {print $1,$2,$3,$4,$5,$6,$7,$8,$9}' tb.csv | read ksk1 ksk2 ksk3 ksk4 ksk5 ksk6 ksk7 ksk8 ksk9

它正在读取第18行的每个值并将其存储在变量ksk(1到9)

预期结果

  1. 变量ksk应该包含整个值"14-Jan-2016 02:40:25",但14-Jan-2016采用不同的变量, 02:40:25和其他人一样,似乎空间是问题 - 期待awk 应忽略空格并考虑一个变量中的值
  2. 对于数据11,01,,,,,,,01/19/2016,中间有空白的awk 忽略空白并将值01/19/2016指定为第3 ksk个变量 - 期望空白值被固定为单独的变量和 第9个变量被赋值01/19/2016

2 个答案:

答案 0 :(得分:0)

您可以使用逗号输出字段,逗号作为分隔符,并通过阅读设置IFS=","

awk -F, -v OFS="," '{..yourcodes}'|IFS="," read...

答案 1 :(得分:0)

awk部分正在做你想要的一切,之后的shell就是你没有用awk输出做你想做的事。

如果你正在使用bash:

$ IFS=, read -ra ksk < <(awk 'NR==2' file)
$ for (( i=0; i<${#ksk[@]}; i++ )); do printf "ksk[%d]:\"%s\"\n" "$i" "${ksk[i]}"; done
ksk[0]:"10"
ksk[1]:"01"
ksk[2]:"15-Jan-2016 02:38:45"
ksk[3]:"15-Jan-2016 02:40:28"
ksk[4]:"15-Jan-2016 03:50:50"
ksk[5]:"15-Jan-2016 06:21:09"
ksk[6]:""
ksk[7]:""
ksk[8]:"01/17/2016"

$ IFS=, read -ra ksk < <(awk 'NR==3' file)
$ for (( i=0; i<${#ksk[@]}; i++ )); do printf "ksk[%d]:\"%s\"\n" "$i" "${ksk[i]}"; done
ksk[0]:"11"
ksk[1]:"01"
ksk[2]:""
ksk[3]:""
ksk[4]:""
ksk[5]:""
ksk[6]:""
ksk[7]:""
ksk[8]:"01/19/2016"

还可以google bash mapfilereadarray查看它们是否对您有用。