awk在比赛前打印所有部分

时间:2017-11-17 10:13:12

标签: bash awk sed grep

我有一些文字,我想抓住所有文本到年份,包括在内。我尝试过这样的事情

awk '/[1-2][0-9][0-9][0-9]/{print $1}'

但是只打印第一个"字"输入

"Financial summary 1997 FINAL.doc" => "Financial"
"v4 Minutes 19950705" => "v4"

我想要的是"财务摘要1997"和" v4分钟1995"。我已经玩过$ NF和其他各种没有成功但我还不知道有多少单词,或者有多少单词,所以我不能打印$ 1 $ 2 $ 3 。我不必使用awk,但它会很有用,因为我实际上打算用一些周围的标签打印结果输出到HTML文件。

我可以将字段分隔符设置为" 4位"但是丢弃了这一年

 awk -F[1-2][0-9][0-9][0-9] '{print $1}

编辑: 这就是我最终得到的结果,然后又回来看看发布的解决方案:

awk 'match($0,/.*(19|20)[0-9]{2}/){print substr($0,RSTART,RLENGTH)}'

全部谢谢

5 个答案:

答案 0 :(得分:2)

您可以使用此grep命令:

grep -oE '[^"]* [1-2][0-9]{3}' file

Financial summary 1997
v4 Minutes 1995

对于awk,您可以使用gensub

awk '{ print substr(gensub(/^(.* [1-2][0-9]{3}).*/, "\\1", "1"), 2) }' file

Financial summary 1997
v4 Minutes 1995

答案 1 :(得分:1)

awk 解决方案:

container.variables

输出:

awk 'match($0,/.*\<[12][0-9]{3}/){ print substr($0,RSTART,RLENGTH)"\042" }' file

答案 2 :(得分:0)

关注awk可以帮助您。

awk 'match($0,/.*[1-2][0-9][0-9][0-9]/){print substr($0,RSTART,RLENGTH) s1}' s1="\""   Input_file

说明: 使用此match awk实用程序来匹配此处的正则表达式,这将查找到[1-2][0-9][0-9][0-9]然后是找到任何match正则表达式,然后设置RSTARTRLENGTH变量的值(awk的开箱变量),然后打印该行的子字符串point是RSTART的值,直到RLENGTH

答案 3 :(得分:0)

sed -r 's/(.*[1-2][0-9][0-9][0-9]).*/\1"/' input
"Financial summary 1997"
"v4 Minutes 1995"

答案 4 :(得分:0)

awk '{sub(/97/,"97\"");print $1,$2,$3}' file

"Financial summary 1997"
"v4 Minutes 19950705"

我们所要做的就是打印三个第一个字段 并在1997年之后添加双引号。在

的帮助下

sub添加了double,但必须先将其转义为“\” 就是这样。