ファイルを読み、特定の文字列が最初に表示されることを検索し、特定のパターンのみを一致させます。

ファイルを読み、特定の文字列が最初に表示されることを検索し、特定のパターンのみを一致させます。

この質問は質問の連続です私は以前尋ねました。

サンプルデータファイル:

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、、、、、、、。empnamesalarydeptageJOD

したがって、出力は次の出力ファイルに似ている必要があります。

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)

アレイをリセットします。

おすすめ記事