关于三元运算符和printf函数的Bash-shell语法问题

时间:2017-12-05 05:46:36

标签: bash shell awk sed

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函数的语法问题。 请支持我。

4 个答案:

答案 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是提取匹配模式的选项