如果我想刪除一個特定圖案的線在一個領域,例如第三場,我可以這樣寫:刪除行,如果所有字段匹配特定模式
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
也不例外。
謝謝。
如果我想刪除一個特定圖案的線在一個領域,例如第三場,我可以這樣寫:刪除行,如果所有字段匹配特定模式
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
也不例外。
謝謝。
使用的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
使用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
編輯腳本。
除了沒有錨,它只需要在最後一個包含1/2,可能是1/24 – 123
@ 123正確。答案已更新。 – Kusalananda
@EdMorton感謝'-E'信息。但是,只有命令採用了其他分隔符。 'sed':pattern:d''不幸的是不會炒鍋。 – Kusalananda
$ 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
能否用sed'sed的「/^\(1 \/2 [[:空間:]] * \)\ + $/d'' – 123
謝謝。有用。我必須在我的實際文件中更改我的原始文件結構的問題,我有幾列可以有模式。無論如何,我會讓它工作。 – Homap