Shell-Script
讀取文件並蒐索特定字元串的第一次出現並僅匹配某些模式
這個問題是我之前提出的問題的延續
樣本數據文件:
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)
重置陣列。