我有一个我正在尝试处理的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"
因为它看到空格并将它们解释为新行。
我可以让它停止吗?
答案 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)
需要注意的一点是,您不需要使用cat
或for
循环。除非我错过了更大的图片......
在文件上调用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