Linux - 一連の行で複数のパターンを識別して置き換える

Linux - 一連の行で複数のパターンを識別して置き換える

入力内容:

objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetorgperson
objectClass: org-abc
objectClass: org-xyz

objectClass: top
objectClass: inetOrgPerson
objectClass: org-abc
objectClass: organizationalPerson
objectClass: person

objectClass: top
objectClass: org-abc
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: org-xyz

objectClass: top
objectClass: inetOrgPerson
objectClass: org-xyz
objectClass: organizationalPerson
objectClass: person

50MB サイズの LDIF ファイルを読み込みます。

2つの改行の間の内容は、次のように処理されます。詰まった

  • この2行(objectClass:org-abc&objectClass:org-xyz)がランダムな順序で表示される場合詰まった次に、BLOCKからこれら2行を削除し、「objectClass:org-111」という新しい行を追加します。

(または)

  • "objectClass: org-abc" 行が単独で存在する場合詰まったその行を「objectClass:org-222」に置き換えます。

(または)

  • "objectClass: org-xyz" 行が単独で存在する場合詰まったその行を「objectClass:org-333」に置き換えます。

予想出力:

objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetorgperson
objectClass: org-111

objectClass: top
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: org-222

objectClass: top
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: org-111

objectClass: top
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: org-333

Linuxコマンド(sedまたはawk)を使用してこれらの出力を取得したり、より良い方法を提案したりするにはどうすればよいですか?

ベストアンサー1

複雑AWK解決策:

awk 'function process(a,c) {       # process the lines of one passed block
         for (i=1; i<=c; i++) {    
             split(a[i], fields);  # split the line into 2 fields
             if (fields[2]=="org-abc") abc="222"; 
             else if (fields[2]=="org-xyz") xyz="333"; 
             else print a[i] 
         } 
         if (abc || xyz) printf "objectClass: org-%s\n",(abc && xyz? "111" : (abc? "222":"333")) 
     }
     !NF{ process(a, c); c=abc=xyz=0 }
     { a[++c]=$0 }
     END{ process(a, c) }' file

これはメモリ適切配列がa単一行を保持するため、ソリューション詰まった全体の処理時間中のみ。 (カウンターはc次回毎回リセットされます。詰まった)

出力:

objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetorgperson
objectClass: org-111

objectClass: top
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: org-222

objectClass: top
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: org-111

objectClass: top
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: org-333

おすすめ記事