我试图了解awk中的一些命令,这些命令与If statement inside awk to change a value问题有关。
输入文件是
...
MODE P E
IMP:P 1 19r 0
IMP:E 1 19r 0
...
SDEF POS= 0 0 14.6 AXS= 0 0 1 EXT=d3 RAD= d4 cell=23 ERG=d1 PAR=2
SI1 L 0.020
SP1 1
SI4 0. 3.401
SI3 0.9
...
NPS 20000000
,代码是
#! /bin/bash
vals=(0.02 0.04)
for val in "${vals[@]}"; do
awk -v val="$val" '
BEGIN { i=1; split (val,v," ") }
# If it is a string, find the sequence SI1 L and change the value after that, using values that the user inputs
/SDEF POS.*ERG=[a-zA-Z]+/ { flag="y" ; }
/SI1 L/ { if (flag=="y") { $3=v[i]; i++; flag="n"; } }
# If it is a number, change the number using values that the user inputs.
/SDEF POS.*ERG=[0-9]+ / { sub(/ERG=[0-9]*/, "ERG="v[i],$0);i++; }
1
' 20small > "${val}"
done
我试图理解以下
[a-z]
,[A-Z]
和[0-9]
之后有+
个符号?我可以理解这些命令在定义的序列之后搜索任何字母和数字,但我似乎不明白+
做了什么。flag
究竟做了什么?我可以理解,/<expresion>/ flag="y"
“将<expresion>
替换为y
。我似乎无法理解改变旗帜的原因如下几行。它是否像假旗?/ /
究竟做了什么?我知道这声明了搜索模式。为什么要添加SDEF
和POS
?只是为了确定它是正确的线?我也发现混淆使用.*
。这是否意味着查找SDEF POS
行并在同一行查找ERG
,无论它们之间是什么? /SDEF POS.*ERG=[a-zA-z]+/
究竟做了什么?我是awk
的新手,所以我试图通过示例来学习它。帮助会更受欢迎!
答案 0 :(得分:3)
+
表示一次或多次重复。例如,a+
将匹配a
aa
aaa
等a*
与+
匹配,但也不会a
< / p>
标志用作临时信息持有者。
/ /
是正则表达式持有者,用于表明它必须与两个/
我建议您查看一些awk
一个内衬,并尝试了解它们的工作原理。首先阅读一些awk
教程。您可以使用Google找到很多。