我试图解析一个CSV文件,其中包含一个典型的访问控制矩阵表到一个shell脚本.我的样本CSV文件是
"user","admin","security"
"user1","x",""
"user2","","x"
"user3","x","x"
Run Code Online (Sandbox Code Playgroud)
我将使用此列表,以便在各自的文件夹中创建文件.问题是如何让它存储第2/3列(admin/security)的值?我想要实现的输出是对具有管理员/安全权限的所有用户进行分组/排序,并在各自的文件夹中创建文件.(我的想法是将所有管理员/安全用户存储到不同的文件中并从那里运行.)
环境不允许我使用任何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
如果你可以使用cut(1)
(你可能可以使用任何类型的unix),你可以使用
cut -d , -f (n) (file)
Run Code Online (Sandbox Code Playgroud)
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"
Run Code Online (Sandbox Code Playgroud)
请注意,这不适用于一般的csv文件(不处理转义的逗号),但它应该适用于类似于简单用户名和x的示例中的格式的文件.
如果你只想获取用户名列表,那么awk
几乎就是为这项工作制作的工具,下面的答案确实很好,我不需要重复.
但是grep解决方案可能更快,更轻巧
该grep
解决方案:
grep '^\([^,]\+,\)\{N\}"x"'
Run Code Online (Sandbox Code Playgroud)
其中N
是第N列,用户为第0列.
$ grep '^\([^,]\+,\)\{1\}"x"' sample.csv
"user1","x",""
"user3","x","x"
$ grep '^\([^,]\+,\)\{2\}"x"' sample.csv
"user2","","x"
"user3","x","x"
Run Code Online (Sandbox Code Playgroud)
从那里你可以cut
用来获得第一列:
$ grep '^\([^,]\+,\)\{1\}"x"' sample.csv | cut -d , -f 1
"user1"
"user3"
Run Code Online (Sandbox Code Playgroud)
并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
Run Code Online (Sandbox Code Playgroud)