2

我有一个我正在尝试处理的 CSV,但是我的一些字段包含逗号、换行符和空格,现在我想起来,那里可能也有一些撇号。

对于逗号和换行符,我已经在输出阶段将它们转换为其他字符串,并在最后将它们转换回来(是的,它很乱,但我只需要运行一次)我意识到我可能必须用也有空格,但我已将问题分解为基本部分,看看我是否可以解决它

这是一个 input.csv

"john","beatles.com","arse","fool@wonka.com","1","1","on holiday"
"paul","beatles.com","bung","","0","1","also on holiday"

(我试过带引号和不带引号)

这是脚本

INPUT="input.csv"

for i in `cat ${INPUT}`

do
#USERNAME=`echo $i | awk -v  FS=',' '{print $1}'`
USERNAME=`echo $i | awk 'BEGIN{FS="[|,:]"} ; {print $1}'`
echo "username: $USERNAME"

done

所以这应该只输入 john 和 paul 但我得到了

username: "john"
username: holiday"
username: "paul"
username: on
username: holiday"

因为它看到空格并将它们解释为新行。

我可以让它停止吗?

4

4 回答 4

3

不是awk,而是导致分词的外壳( 的默认值IFS)。

您可以通过以下方式解决此问题:

while read -r i; do
  USERNAME=$(echo "$i" | awk 'BEGIN{FS="[|,:]"} ; {print $1}');
  echo "username: $USERNAME";
done < $INPUT

为了验证 shell 如何读取输入,添加

echo "This is a line: ${i}"

在循环。

于 2013-11-12T19:38:11.140 回答
1

您可以在 awk 中使用任何正则表达式字段分隔符,例如使用可选的逗号后跟双引号:

awk -F ',?"' '{print $2, $4, $6, $8, $10, $12, "<" $14 ">"}' f1
john beatles.com arse fool@wonka.com 1 1 <on holiday>
paul beatles.com bung  0 1 <also on holiday>

附上最后一个字段$14n< and >以展示它是如何进入单个 awk 变量的。

于 2013-11-12T19:32:56.400 回答
0

有几点需要注意,不需要使用cat或者for循环。除非我错过了更大的图景......

当您对文件调用 awk 时会发生什么?

awk -F"," '{print $1}' input.csv

我得到以下信息:

$ awk -F"," '{print $1}' input.csv
"john"
"paul"
$
于 2013-11-12T19:36:55.327 回答
0

无 awk 的解决方案:

cut -d, -f1 input.csv | while read -r USERNAME ; do echo "username: ${USERNAME}" ; done

以上假设您要保留引号。如果不...

cut -d, -f1 input.csv | sed 's,^",,;s,"$,,' | while read -r USERNAME ; do echo "username: ${USERNAME}" ; done

以上两个都假设您的字段内容中没有逗号。如果不是这样,请在您最喜欢的脚本语言中使用“适当的”CSV 解析器。例子...

ruby -rcsv -ne 'puts CSV.parse_line($_)[0]' input.csv | while read -r USERNAME ; do echo "username: ${USERNAME}" ; done
于 2013-11-12T19:38:02.310 回答