ファイル内のオブジェクトの一致数を取得する

ファイル内のオブジェクトの一致数を取得する

次の項目を含む大容量ファイルがあります。

entry-id: 1
sn: John
cn: Smith
empType: A
ADID: 123456

entry-id: 2
sn: James
cn: Smith
empType: B
ADID: 123456

entry-id: 3
sn: Jobu
cn: Smith
empType: A
ADID: 123456

entry-id: 4
sn: Jobu
cn: Smith
empType: A
ADID: 

各項目は改行文字で区切られます。 empType Aを使用して項目数を計算し、ADIDの後に値(合計2つ)が必要です。私はawk、grep、egrepを試してみましたが、それでも運はありません。どんなアイデアがありますか?

答え1

Awk解決策:

awk '/empType: /{ f=($2=="A"? 1:0) }f && /ADID: [0-9]+/{ c++ }END{ print c }' file
  • f-empType: A部分処理を示すフラグ
  • cempType: AADID- パディングキーを利用した入場回数

出力:

2

答え2

""空行をレコード区切り文字として使用RSし、新しい行を\nフィールド区切り文字として使用する別のawkソリューションは次のとおりです。FS

BEGIN {RS=""; FS="\n"}
{
    split($4,a,": ")
    split($5,b,": ")
}
a[2]=="A" && b[2]!="" {c++}
END {print c}

スクリプトを実行できます。

awk -f main.awk file

答え3

2つの簡単なgrep方法のうちデータ入力ファイルは次のとおりです。

grep -A1 'empType: A' data | grep -c 'ADID: .\+'

出力:

2

答え4

の場合、perl次のようになります。

perl -l -00ne '
  my %f = /(.*?):\s*(.*)/g;
  ++$n if $f{empType} eq "A" && $f{ADID} ne "";
  END {print 0+$n}' < file
  • -n与えられたコードが-e各入力レコードに適用されるようにします。
  • -00段落として記録されます。
  • %fキーと値が(key):spaces(value)レコードの各キーと値にマップされる連想配列を作成します。
  • $n条件が満たされると増加します。
  • 印刷します$n(一致するものがない場合は空の文字列を取得しないようにEND追加されます)。00

関連情報