2016-10-12 3 views
1

テキストファイルに固有のレコード番号で助けが必要です。 これはldifファイルで約2GBです。処理機械はunixなので、awkをタイプしました。既にnlとcatを試していますが、もっと複雑に見えますが、awkはSQLに慣れていますが、これに近いです:-)UNIXでファイル内の各グループの行番号をawkのprobabiltyに基づく

目標はグループとグループの要素の数値の一意性を保証することです:

  1. 属性で始まるデータグループ内の各行に番号を繰り返すことでカラムを追加「dnは:」(それは行番号やカウンターを繰り返すことができる)重要なことは、それがグループ間で一意である必要があります。
  2. 属性が繰り返されているときは、増分番号で列を追加します。

入力:

dn: uc=an 
version: 12 

dn: uid=fcb 
uid: ljfhsfff 
missdata: at12 
missdata: at3 
fladata: part2 
fladata: part3 
fladata: part1 

dn: uid=fccb 
uid: kjhfa8 
missdata: at1 
missdata: at8 
missdata: at10 
missdata: at14 
fladata:: a06b6a== 
fladata: part3 
att: dsc 

出力(可能性の1つ):

1 1 dn: uc=an 
1 1 version: 12 

2 1 dn: uid=fcb 
2 1 uid: ljfhsfff 
2 1 missdata: at12 
2 2 missdata: at3 
2 1 fladata: part2 
2 2 fladata: part3 
2 3 fladata: part1 

3 1 dn: uid=fccb 
3 1 uid: kjhfa8 
3 1 missdata: at1 
3 2 missdata: at8 
3 3 missdata: at10 
3 4 missdata: at14 
3 1 fladata:: a06b6a== 
3 2 fladata: part3 
3 1 att: dsc 

答えて

2
$ awk -F':' '{if (NF) {$0 = (grpNr+1) OFS (++eltCnt[$1]) OFS $0} else {++grpNr; delete eltCnt}} 1' file 
1 1 dn: uc=an 
1 1 version: 12 

2 1 dn: uid=fcb 
2 1 uid: ljfhsfff 
2 1 missdata: at12 
2 2 missdata: at3 
2 1 fladata: part2 
2 2 fladata: part3 
2 3 fladata: part1 

3 1 dn: uid=fccb 
3 1 uid: kjhfa8 
3 1 missdata: at1 
3 2 missdata: at8 
3 3 missdata: at10 
3 4 missdata: at14 
3 1 fladata:: a06b6a== 
3 2 fladata: part3 
3 1 att: dsc 
+1

以前にご回答を見た - あなたは最高です。これはLinuxで期待どおりに動作しますが、これはsolarisなので、delete eltCntをsplit( ""、array、 ":")に置き換え、おそらくnawkを正しく使うべきでしょうか? – jareeq

+1

Solarisでは、nawk(POSIXより前)ではなく/ bin/awk(old、broken awk)ではなく/ usr/xpg4/bin/awkを使用する必要があります。はい、あなたは 'delete eltCnt'の代わりに' split( ""、eltCnt) 'を使う必要がありますが、後者を最初に試してみる必要があります。 split()を使用した場合、3rg argは必要ありません。 –

+0

もう一度エド、昨日このバージョンを見つけて、 'delete'を実装しました。その間、私はawkに精通し、ldifからcsvにデータを直接ピボットできることに気付きました。例に基づいて、私はすでにスクリプトを使っていますが、残念なことに、同じ名前の複数の属性を操作することはできません(上記と同じです)。私はこれを理解しようとするか、すでにやったことで新しい質問をします。 – jareeq

関連する問題