この質問は質問の連続です私は以前尋ねました。
サンプルデータファイル:
empid;A1001
empname;ABC
salary;3000
dept;ABC
age;24
dept;112
JOD;20170101
empid;#201
empid;A2001
salary;5000
dept;XYZ
age;27
JOD;20170303
age;92
empid; #3300
empid;A1002
empname;MAN
salary;11000
dept;SCI
age;30
dept;Geology
JOD;20180607
empid; #XY123
empid;A1005
empname;NAME
salary;10200d
dept;XYZ
JOD;20161212
empidを無視する#
か、最初の文字でempidの項目のみを一致させ、属性セット内のA
各属性が最初に表示される項目のみを一致させる必要があります。empid
、、、、、、、。empname
salary
dept
age
JOD
したがって、出力は次の出力ファイルに似ている必要があります。
empid;A1001
empname;ABC
salary;3000
dept;ABC
age;24
JOD;20170101
empid;A2001
salary;5000
dept;XYZ
age;27
JOD;20170303
empid;A1002
empname;MAN
salary;11000
dept;SCI
age;30
JOD;20180607
empid;A1005
empname;NAME
salary;10200
dept;XYZ
JOD;20161212
手順を案内し、追加情報が必要な場合はお知らせください。
答え1
各従業員の履歴が行で始まると仮定すると、empid
「間違った」行を完全に無視(印刷しない、または「記録の開始」とマークしない)によって、以前のempid
質問に対する回答を簡単に修正できます。
awk -F';' '$1=="empid"{if ($2!~/^A/) next; delete a} !a[$1]++' input.txt > output.txt
empid
「値」フィールドを持つすべての行は無視されます。いいえその行が見つかったら、A
まずコマンドを実行します。next
これに加えて、配列を使用して、現在のレコードで指定された属性名がどのくらいの頻度で見つかったかを保存し、そのレコードですでに発生した属性をスキップします。行が発生すると、empid
新しいレコードの配列がリセットされます(定義に従って「有効な」IDが含まれている場合)。
同様に宣言をawk
実装しないdelete a
バージョンではみんな配列変数、このコマンドは次のように置き換える必要があります。
split("",a)
アレイをリセットします。