假设多行文本文件file
。
$cat file
foo bar baz
foo bar baz qux
foo bar baz quux # Line to be deleted
foo bar quux
我希望删除满足这两个条件的所有行:(a)该行包含关键字“ quux ”,(b)该行立即包含关键字“ qux ”的行。
$cat file | sought_command
foo bar baz
foo bar baz qux
foo bar quux
我不知道哪个UNIX工具可以应用于这样的双重条件(可能是 awk ,但我不确定)并且会很感激建议。
修改1 :
在被告知awk
是使用的工具并且在进一步考虑任务时,我正在寻找可以容易地修改的代码,使得条件(b)可以被反转(即,“(b)线如果需要,不会立即在包含关键字“qux”“)的行之前。
答案 0 :(得分:0)
awk 脚本可以执行您想要的操作:
$ cat tst.awk
/quux/ && p { p=/qux/; next }
{ p=/qux/ }
{ print }
输入:
$ cat input.txt
foo bar baz qux
foo bar baz quux qux
foo bar baz quux
foo bar quux
给出:
$ awk -f tst.awk input.txt
foo bar baz qux
foo bar quux
后续问题是删除一行包含'quux'并且前一行不包含'qux'。一个简单的否定p就是要做的事。
cat tst2.awk
/quux/ && !p { p=/qux/; next }
{ p=/qux/ }
{ print }
输入:
$ cat del.txt
foo bar baz qux
foo bar baz quux qux
foo bar baz quux
foo bar quux # to be deleted
给出:
awk -f tst2.awk del.txt
foo bar baz qux
foo bar baz quux qux
foo bar baz quux
答案 1 :(得分:0)
这可能是您正在寻找的内容,具体取决于您是否需要字符串或正则表达式比较以及部分或完全匹配。
1)删除包含quux的行,前一行包含qux:
$ awk '!(/quux/ && p~/qux/); {p=$0}' file
foo bar baz
foo bar baz qux
foo bar quux
2)如果行包含quux并且前一行不包含qux:
,则删除该行awk '!(/quux/ && p!~/qux/); {p=$0}' file
如果您希望避免双重否定,则布尔代数可以减少为:
awk '!/quux/ || p~/qux/; {p=$0}' file
您喜欢的任何复合条件都只需通过&& -ing和/或|| -ing和/或否定$ 0上的测试(隐含在/.../
)和p。
答案 2 :(得分:0)
您可以通过以下方式使用Map {
id: map
anchors.fill: parent
plugin: mapPlugin
center: QtPositioning.coordinate(22.5726, 88.3639)
zoomLevel: 14
MapItemView {
model: markerModel
delegate: markerDelegate
}
Component {
id: markerDelegate
MapQuickItem{
anchorPoint: Qt.point(2.5, 2.5)
coordinate: QtPositioning.coordinate(position.x, position.y)
zoomLevel: 0
sourceItem: Rectangle{
width: settings.marker_size;
height: settings.marker_size;
radius: settings.marker_size/2;
color: settings.marker_colors[status]
border.color: "white"
border.width: 1
}
}
}
}
Rectangle {
id: rectangle1
anchors.top: map.top
anchors.right: map.right
width: 500
height: 750
color: "#ffffff"
}
:
awk