这个问题是一个问题的延续我之前问过
样本数据文件:
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)
重置阵列。