cat file
chenghuanghuijia jidianzhong 100 E20128
pannybudaqiu gujihuihenwan -1
shuijiao buxihuan 20 E20138
huijiakan babamama 10
我想得到的结果是,当该行包含E2 [0-9] * $时,该行的末尾将被打印,如果该行不包含E2 [0-9] * $,则该行的结尾将打印为NULL或\ n。
这是我的代码:
awk '{printf("%s\n",($NF~/E2[0-9]*$/? "E2.*$" : NULL))}' file
输出如下:
E2.*$
E2.*$
但我想打印E20128& E20138,所以我通过删除"验证了我的代码。 "
awk '{printf("%s\n",($NF~/E2[0-9]*$/? E2.*$ : NULL))}' file
然后出现错误:
awk: cmd. line:1: {printf("%s\n",($NF~/E2[0-9]*$/? E2.*$ : NULL))}
awk: cmd. line:1: ^ syntax error
awk: cmd. line:1: {printf("%s\n",($NF~/E2[0-9]*$/? E2.*$ : NULL))}
awk: cmd. line:1: ^ syntax error
awk: cmd. line:1: {printf("%s\n",($NF~/E2[0-9]*$/? E2.*$ : NULL))}
awk: cmd. line:1: ^ syntax error
所以我认为是三元运算符(_?x:y)或printf函数的语法问题。 请支持我。
答案 0 :(得分:2)
你可以试试这个awk
awk '{$0=$NF}!/E2[0-9]*$/{$0=""}1' infile
{$0=$NF} : for each line replace the complete line by the last field.
!/E2[0-9]*$/ if the line not match the regex
{$0=""} : substitute the complete line by nothing
1 : print each line
答案 1 :(得分:0)
思考了一段时间后,下面的作品:
awk '{printf("%s\n",($NF~/E2[0-9]*$/? $NF : NULL))}' file
答案 2 :(得分:0)
使用GNU sed:
sed '/.*\(E2[0-9]*\)$/s//\1/;//!s/.*//' file
/.*\(E2[0-9]*\)$
:捕获与E2[0-9]*
匹配的字符串,并使用反向引用(s//\1/
)//!
:如果没有匹配的字符串,请清除该行(s/.*//
)答案 3 :(得分:0)
如果您只想提取E2...
,那么简单的grep
就足够了:
grep -o "E2[0-9]*$" file
-o
是提取匹配模式的选项