读取文件并搜索特定字符串的第一次出现并仅匹配某些模式

读取文件并搜索特定字符串的第一次出现并仅匹配某些模式

这个问题是一个问题的延续我之前问过

样本数据文件:

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)

重置阵列。

相关内容