如何使用 awk 从模式开始打印,以另一个模式结束然后退出?
how do I use awk to print starting at pattern, end at another pattern then exit?
我有一个格式如下的文本文件:
50000
55000
60000
65000
150000
160000
我想打印从 50000 开始到 60000 结束的所有内容。我尝试的是:
awk "/50000/,/60000/ {print}"
但这也会打印 150000 和 160000。我应该如何修改它?
目前,您在 150000
中获得 50000 的部分匹配,在 160000
中获得 60000 的部分匹配,并且您正在打印:
50000
55000
60000
和
150000
160000
如果你想匹配整行而不是部分匹配,你可以使用锚点作为开始和结束模式。
awk '/^50000$/,/^60000$/' file
awk 的最佳做法是不要使用 sed 样式的正则表达式范围。
相反,设置一个标志开始打印,另一个标志停止(也许退出)。
示例:
seq 100 | awk '
/^22$/{f=1}
/^29$/{exit}
f'
打印:
22
23
24
25
26
27
28
如果您没有匹配正则表达式,您可以将条件设置为等效
$ awk '[=10=]==50000,[=10=]==60000' file
会给你想要的范围。
此外,数字比较有效:
awk '50000 <= && <= 60000' file
这里的print
是隐含的。
您也可以采用 string-based 方法:
gawk/nawk '/^(5[0-9]{4}|6[0]{4})$/'
mawk/mawk2 '/^(5[0-9][0-9][0-9][0-9]|60000)$/'
我建议不要使用 [[:digit:]]
代替 [0-9]
,因为 non-C/POSIX
区域设置可能会导致匹配 multi-byte“数字”,例如 Unicode 中的数字。
how do I use awk to print starting at pattern, end at another pattern
then exit?
如果您只在第一个范围内感兴趣,那么在第一次出现结束模式时 exit
,令 file.txt
内容为
50000
55000
60000
65000
150000
160000
然后
awk '/50000/,/60000/{print}/60000/{exit}' file.txt
输出
50000
55000
60000
请注意,此代码将在遇到第一个 /60000/
时尽快结束处理,如果您的文件很大并且对靠近开始的第一个范围感兴趣,这将很有用。
(在 gawk 4.2.1 中测试)
你会做的稳健而高效:
awk '==50000{f=1} f{print; if (==60000) exit}' file
exit
所以 awk 不会在您要处理的最后一行之后很长时间内继续浪费时间读取输入。
以上假定如果输入中不存在 60000 但存在 50000,那么您希望打印从 50000 到文件末尾的行。如果不是这样的话:
awk '==50000{f=1} f{ buf=buf ORS; if (==60000) {printf "%s", buf; exit} }' file
我有一个格式如下的文本文件:
50000
55000
60000
65000
150000
160000
我想打印从 50000 开始到 60000 结束的所有内容。我尝试的是:
awk "/50000/,/60000/ {print}"
但这也会打印 150000 和 160000。我应该如何修改它?
目前,您在 150000
中获得 50000 的部分匹配,在 160000
中获得 60000 的部分匹配,并且您正在打印:
50000
55000
60000
和
150000
160000
如果你想匹配整行而不是部分匹配,你可以使用锚点作为开始和结束模式。
awk '/^50000$/,/^60000$/' file
awk 的最佳做法是不要使用 sed 样式的正则表达式范围。
相反,设置一个标志开始打印,另一个标志停止(也许退出)。
示例:
seq 100 | awk '
/^22$/{f=1}
/^29$/{exit}
f'
打印:
22
23
24
25
26
27
28
如果您没有匹配正则表达式,您可以将条件设置为等效
$ awk '[=10=]==50000,[=10=]==60000' file
会给你想要的范围。
此外,数字比较有效:
awk '50000 <= && <= 60000' file
这里的print
是隐含的。
您也可以采用 string-based 方法:
gawk/nawk '/^(5[0-9]{4}|6[0]{4})$/'
mawk/mawk2 '/^(5[0-9][0-9][0-9][0-9]|60000)$/'
我建议不要使用 [[:digit:]]
代替 [0-9]
,因为 non-C/POSIX
区域设置可能会导致匹配 multi-byte“数字”,例如 Unicode 中的数字。
how do I use awk to print starting at pattern, end at another pattern then exit?
如果您只在第一个范围内感兴趣,那么在第一次出现结束模式时 exit
,令 file.txt
内容为
50000
55000
60000
65000
150000
160000
然后
awk '/50000/,/60000/{print}/60000/{exit}' file.txt
输出
50000
55000
60000
请注意,此代码将在遇到第一个 /60000/
时尽快结束处理,如果您的文件很大并且对靠近开始的第一个范围感兴趣,这将很有用。
(在 gawk 4.2.1 中测试)
你会做的稳健而高效:
awk '==50000{f=1} f{print; if (==60000) exit}' file
exit
所以 awk 不会在您要处理的最后一行之后很长时间内继续浪费时间读取输入。
以上假定如果输入中不存在 60000 但存在 50000,那么您希望打印从 50000 到文件末尾的行。如果不是这样的话:
awk '==50000{f=1} f{ buf=buf ORS; if (==60000) {printf "%s", buf; exit} }' file