2016-07-12 98 views
1

如果我想刪除一個特定圖案的線在一個領域,例如第三場,我可以這樣寫:刪除行,如果所有字段匹配特定模式

awk '$3!='pattern' file 

如果我想刪除所有字段都符合特定模式的行,我該怎麼做?下面是一個例子文件:

number1 1245 1/2 1/2 1/2 1/2 
number2 1468 1/1 1/2 2/2 1/2 

我想刪除的第一行這種情況下第二場後,所有字段包含1/2也不例外。

謝謝。

+1

能否用sed'sed的「/^\(1 \/2 [[:空間:]] * \)\ + $/d'' – 123

+0

謝謝。有用。我必須在我的實際文件中更改我的原始文件結構的問題,我有幾列可以有模式。無論如何,我會讓它工作。 – Homap

回答

2

使用的sed

sed '\`^\([^[:space:]]\+[[:space:]]\+\)\{2\}\(1/2[[:space:]]\+\)\+1/2[[:space:]]*$`d' file 

-r/-E標誌

sed -r '\`^([^[:space:]]+[[:space:]]+){2}(1/2[[:space:]]+)+1/2[[:space:]]*$`d' file 

假設只有空間用於而不是其他空白字符。

sed -r '\`^([^ ]+ +){2}(1/2 +)+1/2 *$`d' file 

使用AWK

awk '{for(i=3;i<=NF;i++)if($i!="1/2")next;print}' file 

打印

number2 1468 1/1 1/2 2/2 1/2 
1

使用sed簡單的面向行的編輯是這樣的:

$ sed '/pattern/d' input 

在這種情況下,要刪除具有的「​​3210」四點連續出現在該行的末尾的所有行:

$ sed '/\(1\/2\)\{4\}$/d' input 

另外,

$ sed -E '/(1\/2){4}$/d' input 

(如果你有GNU sed,使用-r而不是-E。我是一個BSD系統和使用BSD sed

上的更新:感謝@EdMorton的評論,你可以在模式以下列方式擺脫有點醜陋\/的:

$ sed '\:\(1/2\)\{4\}$:d' input 

$ sed -E '\:(1/2){4}$:d' input 

可能沒有多大意義在這種情況下,但肯定使整個事情更容易了很多閱讀更復雜sed編輯腳本。

+0

除了沒有錨,它只需要在最後一個包含1/2,可能是1/24 – 123

+0

@ 123正確。答案已更新。 – Kusalananda

+1

@EdMorton感謝'-E'信息。但是,只有命令採用了其他分隔符。 'sed':pattern:d''不幸的是不會炒鍋。 – Kusalananda

0
$ awk '{delete cnt; for (i=3;i<=NF;i++) cnt[$i]++} cnt["1/2"] < length(cnt)' file 
number2 1468 1/1 1/2 2/2 1/2 
相關問題