Awk

AWK 一個班輪將三個欄位合併到一個文件中

  • May 11, 2022

我有一個包含兩種類型欄位分隔符的記錄(行)的文件,|如下!所示:

Name|Age|Physics|Chemistry|Maths|English|Batch!Year!AdmisnNo!Grade!Score
Student1|81|65|70|80|88|EWS!2021!1001!A!75
Student2|72|63|60|50|75|EWS!2021!1002!A!85
Student3|72|63|60|50|75|EWS!2021!1002!A!85

如何合併BatchYearAdmisnNo欄位如下?

請注意,為簡潔起見,我展示了一個有用欄位的小列表,因為我的真實文件有許多這樣的相關欄位。我要刪除兩個或三個!標記的這個欄位不是最後一個,可以是大約 49 個欄位總數中的任何欄位(6 或 7)。

Name|Age|Physics|Chemistry|Maths|English|BatchYearAdmisnNo!Grade!Score
   Student1|81|65|70|80|88|EWS20211001!A!75
   Student2|72|63|60|50|75|EWS20211002!A!85
   Student3|72|63|60|50|75|EWS20211002!A!85

我要求awk,但是歡迎任何合理的標準命令。

$ awk -F '|' 'BEGIN { OFS = FS } { sub("!", "", $NF); sub("!", "", $NF) }; 1' file
Name|Age|Physics|Chemistry|Maths|English|BatchYearAdmisnNo!Grade!Score
Student1|81|65|70|80|88|EWS20211001!A!75
Student2|72|63|60|50|75|EWS20211002!A!85
Student3|72|63|60|50|75|EWS20211002!A!85

這用於從輸入的最後一個分隔欄位中awk刪除前兩個字元。!``|

NF在程式碼中使用任意數字代替awk最後一個欄位來影響其他欄位。


假設只有最後一個欄位包含!字元,使用sed

$ sed -e 's/!//' -e 's///' file
Name|Age|Physics|Chemistry|Maths|English|BatchYearAdmisnNo!Grade!Score
Student1|81|65|70|80|88|EWS20211001!A!75
Student2|72|63|60|50|75|EWS20211002!A!85
Student3|72|63|60|50|75|EWS20211002!A!85

這將刪除!每行的第一個。然後它第二次執行完全相同的替換,!也刪除了第二次。


反轉每一行並連續兩次刪除第三!行,然後再次反轉結果行。這允許其他|以 - 分隔的欄位也包含!字元。

$ rev file | sed -e 's/!//3' -e 's///3' | rev
Name|Age|Physics|Chemistry|Maths|English|BatchYearAdmisnNo!Grade!Score
Student1|81|65|70|80|88|EWS20211001!A!75
Student2|72|63|60|50|75|EWS20211002!A!85
Student3|72|63|60|50|75|EWS20211002!A!85

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