我在檔案中有以下示例行:
sweet_25 2 0 4
guy_guy 2 4 6
ging_ging 0 0 3
moat_2 0 1 0
我想處理該檔案并具有以下輸出:
sweet_25 2 0 4
guy 2 4 6
ging 0 0 3
moat_2 0 1 0
請注意,所需的效果發生在第 2 行和第 3 行 - 在出現此模式的行上洗掉了文本后面的下劃線和文本。
我沒有成功完成以下操作:
sed -E 's/([a-zA-Z])_[a-zA-Z]/$1/g' file.txt >out.txt
歡迎任何 bash 或 awk 建議。謝謝
uj5u.com熱心網友回復:
如果要替換下劃線后的整個單詞,則必須將字符類重復一次或多次使用[a-zA-Z] 并\1在替換中使用。
sed -E 's/([a-zA-Z])_[a-zA-Z] /\1/g' file.txt >out.txt
如果下劃線前后的單詞應該相同,則可以使用帶有反向參考的重復捕獲組。
如果您只想對字串的開頭執行此操作,您可以^在模式之前添加并省略/gsed 命令末尾的 。
sed -E 's/([a-zA-Z] )(_\1) /\1/g' file.txt >out.txt
模式匹配:
([a-zA-Z] )捕獲組 1,匹配 1 次或多次出現的 char a-zA-Z(_\1)捕獲組 2,重復匹配_和組 1 捕獲的相同文本
檔案out.txt將包含:
sweet_25 2 0 4
guy 2 4 6
ging 0 0 3
moat_2 0 1 0
uj5u.com熱心網友回復:
使用您顯示的示例,請嘗試以下awk代碼。
awk 'split($1,arr,"_") && arr[1] == arr[2]{$1=arr[1]} 1' Input_file
說明:簡單的解釋是,使用awk'split函式將第一個欄位拆分為一個以arr分隔符_,然后檢查條件是否 arr 的第一個元素等于 arr 的第二個元素,然后僅將 arr 的第一個元素保存到第一個欄位($1)和通過提及1列印已編輯/未編輯的行。
uj5u.com熱心網友回復:
您可以更簡單地執行此操作,如下所示:
sed -E 's/_[a-zA-Z] //' file.txt >out.txt
這只是替換下劃線后跟任意數量的字母字符,什么都沒有。
uj5u.com熱心網友回復:
$ awk 'NR~/^[23]$/{sub(/_[^ ] /,"")} 1' file
sweet_25 2 0 4
guy 2 4 6
ging 0 0 3
moat_2 0 1 0
uj5u.com熱心網友回復:
我會做:
awk '$1~/[[:alpha:]]_[[:alpha:]]/{sub(/_.*/,"",$1)} 1' file
印刷:
sweet_25 2 0 4
guy 2 4 6
ging 0 0 3
moat_2 0 1 0
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/447760.html
