我试图理解awk中的一些命令,这些命令与awk中的If语句有关,以更改值问题。
输入文件是
...
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
所以我想以身作则。一个帮助将更加令人欢迎!
+
表示一个或多个重复。例如,a+
将匹配a
aa
aaa
等。a*
与匹配+
,但也没有a
标志用作临时信息持有者。
/ /
是正则表达式的持有者,用于表明它必须与两个中的正则表达式匹配 /
我确实建议您查看一些awk
衬管,并尝试了解它们的工作原理。另外,请先阅读一些awk
教程。您可以使用Google找到很多东西。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句