我想在输入文件中打印出包含“数字”以及“开始”和“结束”之间的行,并在同一输出文件上打印出来。
我写了那个代码
awk -v string="number" '$0~string' Input >> Output
awk ' /start/ {flag=1;next} /end/{flag=0} flag { print $0}' Input >> Output
但是,它给了我输出的结果,而这并不是我真正想要的
number 1
number 2
start
line 7
line 8
line 9
end
start
line 14
line 15
line 16
end
虽然我想要的是
inputdata:
line 1
line 2
line 3
number 1
line 4
line 5
line6
start
line 7
line 8
line 9
end
line 10
number 2
line 11
line 12
line 13
start
line 14
line 15
line 16
end
输出:
number 1
start
line 7
line 8
line 9
end
number 2
start
line 14
line 15
line 16
end
答案 0 :(得分:4)
awk:
$ awk '/number/;/start/,/end/' file
输出:
number 1
start
line 7
line 8
line 9
end
number 2
start
line 14
line 15
line 16
end
但是,解决方案中存在问题。如果起始-结束块中有number
,它将被打印两次。如果数据确实如此,那么@Ravinder的解决方案就是解决方案。
答案 1 :(得分:2)
使用sed
>>> ctypes.c_int(5) * 5
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for *: 'c_long' and 'int'
>>> ctypes.c_int(5).value * 5
25
答案 2 :(得分:1)
请您尝试以下操作,这样可以避免两次打印字符串number
,以防它也出现在start
和end
之间。
awk '/start/,/end/{print;next}; /number/' Input_file
让我们说以下是Input_file(我在其中添加了一个小的编辑内容,即在其中添加了字符串number
。
cat Input_file
line 1
line 2
line 3
number 1
line 4
line 5
line6
start
line 7
line 8
line 9
end
line 10
number 2
line 11
line 12
line 13
start
line 14
number 13
line 15
line 16
end
awk '/start/,/end/{print;next}; /number/' Input_file
number 1
start
line 7
line 8
line 9
end
number 2
start
line 14
number 13
line 15
line 16
end
答案 3 :(得分:1)
就我个人而言,我永远不会使用范围表达式,因为它会使琐碎的事情的代码变得更加简短,但是当您的需求发生变化时,则需要完整的重写或重复的条件。我总是只用一个标志代替:
$ awk '/start/{f=1} f || /number/{print} /end/{f=0}' file
number 1
start
line 7
line 8
line 9
end
number 2
start
line 14
line 15
line 16
end
f
适用于found
,而不适用于flag
-标志是变量的类型,即为变量的含义。将数字更改为其他内容,这是对您可能表示的意思的1种解释:
$ awk '/start/{f=1} f || sub(/number/,"foobar"){print} /end/{f=0}' file
foobar 1
start
line 7
line 8
line 9
end
foobar 2
start
line 14
line 15
line 16
end