0

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

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

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

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

我想要的输出是

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

4

2 回答 2

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
于 2013-07-25T05:12:00.307 回答
1

让您入门的东西(请注意,这不适用于嵌入逗号的 csv 文件,您必须使用 csv 解析器):

awk -F, '
NR>1 { 
  gsub(/["]/,"",$0); 
  if($2!="" && $3!="") 
    print $1 " has both privileges"; 
    print $1 > "file"
}' csv
于 2013-07-25T05:49:11.933 回答