AWK:如何刪除不包含特定模式的某些行?

AWK:如何刪除不包含特定模式的某些行?

我有一個文件,其中包含帶有各種字母數字字串的行,這些字串以空格-破折號-空格分隔。但是,有些行僅存在一個字母數字值和分隔符,但缺少另一個字串值。例子:

MN_L_DAX-NORDNET_D36 - DK0060975886
MN_L_DAX-NORDNET_D35 - DK0060975613
DK0060056323-DKK -
DK0060186294-DKK -

上面範例中的最後兩行在分隔符號的右側缺少字母數字字串,我想刪除它們。我嘗試使用以下 awk 表達式:

awk '!/* - /' sourcefile.txt > temp.txt && mv temp.txt sourcefile.txt

我的!/* - /意思是“查找在任何字元(*)之後有一個空格-破折號-空格(-)並且之後沒有任何內容的模式,如果沒有找到這樣的模式(!)”,則將其餘行移至臨時。 txt 文件,並將sourcefile.txt 內容替換為temp.txt 內容。但是,當我運行上面的 awk 腳本時,sourcefile.txt 內容沒有任何反應 - 一切都保持不變。我也沒有收到任何錯誤。這裡可能出了什麼問題?鑑於上述範例行,運行 awk 腳本後所需的輸出應如下所示:

MN_L_DAX-NORDNET_D36 - DK0060975886
MN_L_DAX-NORDNET_D35 - DK0060975613

答案1

列印以字母數字字元結尾的行很簡單:

$ awk '/[[:alnum:]]$/' file
MN_L_DAX-NORDNET_D36 - DK0060975886
MN_L_DAX-NORDNET_D35 - DK0060975613

答案2

更簡單:

awk '$3' inputfile

這是 的簡寫awk '$3!=""',這是 的簡寫awk '$3!=""{print}',這是 的簡寫awk '$3!=""{print $0}'

作為記錄:

sed /-$/d可能更快,grep -ve '-$'甚至更快。

答案3

感謝@guillermo chamorro的建議,我能夠透過以下方式修改我的腳本來實現所需的輸出:

awk '!/^.* -$/' sourcefile.txt > temp.txt && mv temp.txt sourcefile.txt

謝謝吉列爾莫。

相關內容