awk +如何用引号读取CSV文件

时间:2014-07-06 12:07:29

标签: linux bash awk sed ksh

我在CSV文件中有以下行

   1,LINUX,"/usr/cti/conf/apps/parameters  param1 param2","root passowrd" 

删除分隔符","由sed

我现在想从行

中读取每个字段
#  echo 1  LINUX "/usr/cti/conf/apps/parameters  param1 param2" "root passowrd"  | awk '{print $1}'
1

#  echo 1  LINUX "/usr/cti/conf/apps/parameters  param1 param2" "root passowrd"  | awk '{print $2}'
LINUX

#  echo 1  LINUX "/usr/cti/conf/apps/parameters  param1 param2" "root passowrd"  | awk '{print $3}'
/usr/cti/conf/apps/parameters

第三个字段的预期结果应为" / usr / cti / conf / apps / parameters param1 param2"

请告知如何阅读该字段以获取引号之间的所有字词

需要在我的awk命令中添加什么内容?

所以如果是单个单词,那么awk应该只打印这个单词 如果awk看到引号之间的单词,那么awk应该在引号之间打印所有单词

  • 注释CSV中的每个字段都可以带引号或不带, 例如,第一个字段可以是3个单词作为“一个二三”或者第一个字段可能只有一个单词,awk应该支持两个单词

2 个答案:

答案 0 :(得分:1)

不要用sed删除逗号:你正在失去" c"在CSV(逗号分隔值)中,事情变得更复杂。如果是这样,您可以使用cut

cut -d',' -f3

示例:

$ cut -d',' -f3 <<< '1,LINUX,"/usr/cti/conf/apps/parameters  param1 param2","root passowrd"'
"/usr/cti/conf/apps/parameters  param1 param2"

$ cut -d',' -f3 <<< '1,LINUX,/usr/cti/conf/apps/parameters  param1 param2,"root passowrd"'
/usr/cti/conf/apps/parameters  param1 param2

当字段以逗号分隔时,它适用于任何情况。因此,您不必担心双引号包装字段的情况。

答案 1 :(得分:0)

在下面的awk命令中,字段分隔符设置为",以便我们可以通过打印列号2轻松获取字符串/usr/cti/conf/apps/parameters param1 param2。要包含双引号,只需添加{{1触发打印命令时变量。

FS

如果您不希望在最终结果中打印$ echo '1 LINUX "/usr/cti/conf/apps/parameters param1 param2" "root passowrd"' | awk -F'"' '{print FS$2FS}' "/usr/cti/conf/apps/parameters param1 param2" ,请尝试以下操作

"

如果您的输入符合此$ echo '1 LINUX "/usr/cti/conf/apps/parameters param1 param2" "root passowrd"' | awk -F'"' '{print $2}' /usr/cti/conf/apps/parameters param1 param2 ,那么您可以使用1,LINUX,"/usr/cti/conf/apps/parameters param1 param2","root passowrd"作为字段分隔符来获取字符串,

"/usr/cti/conf/apps/parameters  param1 param2"