CSVファイルから行を削除する

CSVファイルから行を削除する

次のファイル共有パス、ユーザー名、および権限を含むcsvファイルがあります。

"FolderName";"ADGroupOrUser";"Permissions"
\\path\1 - folder 01\1 - folder2;   user.user;  Modify, Synchronize
\\path\1 - folder 01\1 - folder2;   user1.user1;    Modify, Synchronize
\\path\1 - folder 01\1 - folder2;   user2.user2;    Modify, Synchronize
\\path\1 - folder 01\1 - folder2\1 - folder3;   user.user;  Modify, Synchronize
\\path\1 - folder 01\1 - folder2\1 - folder3;   user1.user1;    Modify, Synchronize
\\path\1 - folder 01\1 - folder2\1 - folder3;   user2.user2;    Modify, Synchronize
\\path\1 - folder 01\1 - folder2\1 - folder3\folder4;   user.user;  Modify, Synchronize
\\path\1 - folder 01\1 - folder2\1 - folder3\folder4;   user1.user1;    Modify, Synchronize
\\path\1 - folder 01\1 - folder2\1 - folder3\folder4;   user2.user2;    Modify, Synchronize
\\path\1 - folder 01\1 - folder2\2 - folder1;   user.user;  Modify, Synchronize
\\path\1 - folder 01\1 - folder2\2 - folder1;   user1.user1;    Modify, Synchronize
\\path\1 - folder 01\1 - folder2\2 - folder1;   user2.user2;    Modify, Synchronize
\\path\2 - folder 01\1 - folder2;   user.user;  Modify, Synchronize
\\path\2 - folder 01\1 - folder2;   user1.user1;    Modify, Synchronize
\\path\2 - folder 01\1 - folder2;   user2.user2;    Modify, Synchronize
...

最初の3行を見るとわかるように、フォルダパスは同じですが、ユーザーは異なります。

ネットワークパスの下に6行以下に別のフォルダがありますが、親フォルダから継承されるため、ユーザーと権限は同じです。

アイデアは、ファイルからこの6行を削除することです。権限が継承されると、それ以降のすべての項目が同じユーザーと権限を持つことになります。

\\path\1 - folder 01\1 - folder2\1 - folder3
\\path\1 - folder 01\1 - folder2\1 - folder3\folder4

この場合、最終結果は次のようになります。

"FolderName";"ADGroupOrUser";"Permissions"
\\path\1 - folder 01\1 - folder2;   user.user;  Modify, Synchronize
\\path\1 - folder 01\1 - folder2;   user1.user1;    Modify, Synchronize
\\path\1 - folder 01\1 - folder2;   user2.user2;    Modify, Synchronize
\\path\2 - folder 01\1 - folder2;   user.user;  Modify, Synchronize
\\path\2 - folder 01\1 - folder2;   user1.user1;    Modify, Synchronize
\\path\2 - folder 01\1 - folder2;   user2.user2;    Modify, Synchronize

bash(MacOS)を使ってファイルを処理しています。

このような

grep -v "\\path\1 - folder 01\1 - folder2*"

パスにはより多くのフォルダがあります。

\\path\1 - folder 01\1 - folder2*

その後、削除

答え1

$ { head -n 1; grep -E '^.{32};'; } < file
"FolderName";"ADGroupOrUser";"Permissions"
\\path\1 - folder 01\1 - folder2;   user.user;  Modify, Synchronize
\\path\1 - folder 01\1 - folder2;   user1.user1;    Modify, Synchronize
\\path\1 - folder 01\1 - folder2;   user2.user2;    Modify, Synchronize
\\path\2 - folder 01\1 - folder2;   user.user;  Modify, Synchronize
\\path\2 - folder 01\1 - folder2;   user1.user1;    Modify, Synchronize
\\path\2 - folder 01\1 - folder2;   user2.user2;    Modify, Synchronize

これが実際に必要なものではない場合は、より良い要件を提供するように質問を編集してください。

答え2

awk次のコマンドを使用できます。

awk -F\\ 'NF<4{ print}' input_file

これは\区切り文字として機能し、フィールド数を計算します。フィールドが4より小さい場合は印刷します。

PS投稿を編集して例を変更すると、コマンドは次のように変更されます。

awk -F\\ 'NF<6{ print}' input_file

答え3

みんなの助けに感謝します。私に合った解決策を見つけました。

grep -v "path\\\\1.-.folder.01\\\\1.-.folder2\\\\"

答え4

これを一度に実行するには、csvをMS ExcelまたはLibreOfficeにインポートし( ";"で区切られたファイルをインポートし、単純なフィルタを使用してパス内の ""文字を計算する)行を削除します。> 1 、数式を含む列を追加 - > LEN(セルファイル共有パス) - LEN(SUBSTITUTE(ファイル共有パス、 ""、""))> 1

一方、プロセスを構築する予定の場合は、SQLデータベースを使用して「;」で区切られたフィールドを持つファイルをインポートし、DELETEコマンドを使用してクエリ/ストアドプロシージャを設定します。つまり、DELETE * FROM <imported_table> WHERE LEN() - LEN(REPLACE(, "", "")) >1 構文は、生成するテーブルの構造に合わせてマテリアライズ/適用されます。

関連情報