【发布时间】:2015-01-02 13:06:53
【问题描述】:
我有一个在 bash 中解析的 CSV 文件,对于一列,对于某些行有多个值。 例如,具有多个值的行可能看起来像
name,12,120,east,"sw1,sw2,sw3"
但并非所有行都有它。有些可能看起来像
name,10,141,west,sw5534a
我想要做的是,如果该列中有引号以删除它们并将变量设置为 sw1,sw2,sw3
脚本的相关部分:
#!/bin/bash
INPUT=file.csv
OLDIFS=$IFS
IFS=,
[ ! -f $INPUT ] && { echo "$INPUT file not found"; exit 99; }
while read name building id region parents
do
echo "
....snip....
parents $parents"
我想要 $parents 的输出应该是 sw1,sw2,sw3 但现在它输出为 "sw1,sw2,sw3"
如果列有逗号来删除第一个和最后两个字符,我已经尝试在条件中搞乱正则表达式匹配,但我无法让它工作。要么它会删除第一个 s 和最后一个 3,要么只会出错。
任何建议表示赞赏!
【问题讨论】:
-
你能不能只做:sed 's/"//g' file.csv
-
文件中的其他字段可以这样引用吗?
-
@Barmar:我不同意您将此问题标记为重复问题。另一个问题是关于 awk,而不是 bash。
-
这是关于使用
awk解析bash脚本中的CSV 文件。我不认为您可以仅使用bash正确地做到这一点。 -
附带问题:您可以在本地为
read语句设置 IFS。这避免了必须保存和恢复它,也避免了它可能在 while 循环主体内进行的任何交互:while IFS=, read name building id region parents。此外,您实际上总是希望将-r标志提供给read。
标签: regex bash conditional