在bash脚本中解析CSV文件

时间:2013-07-25 05:03:08

标签: bash csv sed awk

我正在尝试将包含典型访问控制矩阵表的CSV文件解析为shell脚本。我的示例CSV文件是

"user","admin","security"  
"user1","x",""  
"user2","","x"  
"user3","x","x"

我将使用此列表在各自的文件夹中创建文件。问题是如何让它存储第2/3列(admin / security)的值?我想要实现的输出是对具有管理员/安全权限的所有用户进行分组/排序,并在各自的文件夹中创建文件。 (我的想法是将所有管理员/安全用户存储在不同的文件中并从那里运行。)

环境不允许我使用任何Perl或Python程序。但是,非常感谢任何awksed命令。

我想要的输出是

  

$ cat sample.csv
  “用户”,“管理员”,“安全”
  “用户1”, “X”, “”
  “用户2”, “”, “X”
  “用户3”, “X”, “X”
  $ cat security.csv
  用户2
  用户3
  $ cat admin.csv
  USER1
  用户3

2 个答案:

答案 0 :(得分:5)

如果你可以使用cut(1)(如果你使用的是任何类型的unix,你可以使用它),你可以使用

cut -d , -f (n) (file)

其中n是您想要的列。

您可以使用一系列列(2-3)或列列表(1,3)。

这将留下引号,但你可以使用sed命令或轻量级的东西。

$ cat sample.csv
"user","admin","security"
"user1","x",""
"user2","","x"
"user3","x","x"

$ cut -d , -f 2 sample.csv
"admin"
"x"
""
"x"

$ cut -d , -f 3 sample.csv
"security"
""
"x"
"x"

$ cut -d , -f 2-3 sample.csv
"admin","security"
"x",""
"","x"
"x","x"

$ cut -d , -f 1,3 sample.csv
"user","security"
"user1",""
"user2","x"
"user3","x"

请注意,这不适用于一般的csv文件(不处理转义的逗号),但它应该适用于类似于简单用户名和x的示例格式的文件。


如果您只想获取用户名列表,那么awk几乎就是为这项工作制作的工具,下面的答案可以很好地完成,我不需要重复。

但是grep解决方案可能更快,更轻量化

grep解决方案:

grep '^\([^,]\+,\)\{N\}"x"'

其中N是第N列,用户为第0列。

$ grep '^\([^,]\+,\)\{1\}"x"' sample.csv
"user1","x",""
"user3","x","x"

$ grep '^\([^,]\+,\)\{2\}"x"' sample.csv
"user2","","x"
"user3","x","x"

从那里开始,您可以使用cut获取第一列:

$ grep '^\([^,]\+,\)\{1\}"x"' sample.csv | cut -d , -f 1
"user1"
"user3"

sed 's/"//g'删除引号:

$ grep '^\([^,]\+,\)\{1\}"x"' sample.csv | cut -d , -f 1 | sed 's/"//g'
user1
user3

$ grep '^\([^,]\+,\)\{2\}"x"' sample.csv | cut -d , -f 1 | sed 's/"//g'
user2
user3

答案 1 :(得分:1)

有些东西可以帮助您入门(请注意,这对于带有嵌入式逗号的csv文件不起作用,您必须使用csv解析器):

awk -F, '
NR>1 { 
  gsub(/["]/,"",$0); 
  if($2!="" && $3!="") 
    print $1 " has both privileges"; 
    print $1 > "file"
}' csv