Shell-Script

讀取文件並蒐索特定字元串的第一次出現並僅匹配某些模式

  • May 11, 2020

這個問題是我之前提出的問題的延續

樣本數據文件:

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 的 with#或者說只匹配那些具有A作為第一個字元的 empid 並且只匹配一組屬性中每個屬性的第一次出現: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

請指導我完成它,讓我知道我是否需要其他任何東西。

假設每條員工記錄都以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)

重置陣列。

引用自:https://unix.stackexchange.com/questions/585857