次の項目を含む大容量ファイルがあります。
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
部分処理を示すフラグc
empType: A
ADID
- パディングキーを利用した入場回数
出力:
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
追加されます)。0
0