ソースファイルと参照ファイルから行を抽出して結果ファイルに追加するには? [コピー]

ソースファイルと参照ファイルから行を抽出して結果ファイルに追加するには? [コピー]

問題がありますが、理解できません。ソラリスです。過度に単純化されたソースと参照ファイル。

s.txtソースファイル:

dn: cn=task,cn=Groups,dc=domain 
changetype: modify 
add: uniquemember 
uniquemember: cn=user1,cn=users,dc=domain

dn: cn=task,cn=Groups,dc=domain 
changetype: modify 
add: uniquemember 
uniquemember: cn=user9,cn=users,dc=domain

dn: cn=task,cn=Groups,dc=domain 
changetype: modify 
add: uniquemember 
uniquemember: cn=user10,cn=users,dc=domain

r.txt 参照ファイル:

uniquemember: cn=user9,cn=users,dc=domain 
uniquemember: cn=user8,cn=users,dc=domain

参照レコードUnicamemberファイルを使用して、ソースファイルのcn = user9行と上記の3行を抽出し、結果ファイルusermember_に追加するスクリプトが必要です。

.ldif 追加:

dn: cn=task,cn=Groups,dc=domain 
changetype: modify 
add: uniquemember 
uniquemember: cn=user9,cn=users,dc=domain

ベストアンサー1

r.txt次の値を使用しようとすると一致する複数の行を抽出してs.txtみてください。

awk 'NR==FNR {u[$2]++; next} $NF in u' r.txt RS= s.txt
  • r.txtデフォルト(改行)レコード区切り文字を使用して処理し、u2番目のスペースで区切られたフィールドのキーを使用して連想配列を構成します。
  • RS=切り替えるには、レコード区切り記号の設定をオフにします。短絡モード2番目のファイルの場合
  • 短絡モードで処理されますs.txt。つまり、各空行で区切られたブロックは単一のレコードとして扱われ、$NF最後のフィールド値はルックアップ値として使用できます。u
  • $NF存在する場合は、u履歴全体を印刷します。

一致するレコード間にスペースを追加するには:

GNU awk()がある場合は、特殊変数を使用して元の段落を再追加できgawkます。RT

gawk 'NR==FNR {u[$2]++; next} $NF in u {print $0 RT}' r.txt RS= s.txt

より一般的には、一致する各レコードの後に​​改行を追加できます。

awk 'NR==FNR {u[$2]++; next} $NF in u {print $0 "\n"}' r.txt RS= s.txt

またはデフォルト値に改行を追加出力フィールド区切り記号:

awk 'NR==FNR {u[$2]++; next} $NF in u' r.txt RS= ORS='\n\n' s.txt

おすすめ記事