0

典型的なアクセス制御マトリックス テーブルを含む CSV ファイルをシェル スクリプトに解析しようとしています。私のサンプル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 に答える