如果你可以使用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