如何让awk不使用空格作为分隔符?

时间:2013-11-12 19:29:55

标签: bash csv awk space

我有一个我正在尝试处理的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

所以这应该只输入约翰和保罗,但我得到了

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

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

我可以让它停止吗?

4 个答案:

答案 0 :(得分:2)

不是awk,而是导致分词的shell(默认值为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}"

在循环中。

答案 1 :(得分:0)

您可以在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>

附上最后一个字段$14 n < and >,以展示它在单个awk变量中的获取方式。

答案 2 :(得分:0)

需要注意的一点是,您不需要使用catfor循环。除非我错过了更大的图片......

在文件上调用awk会发生什么?

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

我得到以下内容:

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

答案 3 :(得分: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