我有一个包含多行以"1ECLI H --- 12.345 ....."开头的文件.我想删除I和H之间的空格,并在迭代H模式时添加R/S/T. 例如.H810如果连续三行重复,则应加上字母R,S(第二次迭代),T(第三次迭代).所以它将是H810R.任何帮助将不胜感激.
文字如下所示
1ECLI H813 98 7.529 8.326 9.267
1ECLI H813 99 7.427 8.470 9.251
1ECLI C814 100 7.621 8.513 9.263
1ECLI H814 101 7.607 8.617 9.289
1ECLI H814 102 7.633 8.489 9.156
1ECLI H814 103 7.721 8.509 9.305
1ECLI C74 104 8.164 8.733 10.740
1ECLI H74R 105 8.247 8.690 10.799
Run Code Online (Sandbox Code Playgroud)
在chage
1ECLI H813R 98 7.529 8.326 9.267
1ECLI H813S 99 7.427 8.470 9.251
1ECLI C814 100 7.621 8.513 9.263
1ECLI H814R 101 7.607 8.617 9.289
1ECLI H814s 102 7.633 8.489 9.156
1ECLI H814T 103 7.721 8.509 9.305
1ECLI C74 104 8.164 8.733 10.740
1ECLI H74R 105 8.247 8.690 10.799
Run Code Online (Sandbox Code Playgroud)
谢谢.
如果您的真实输入文件与您发布的文件相同,即使下面的文件也可以提供所需的输出。
awk 'BEGIN{split("R,S,T",a,/,/)}f=$2~/^H[0-9]+$/{$2 = $2 a[++c]}!f{c=0}1' infile
Run Code Online (Sandbox Code Playgroud)
解释
split("R,S,T",a,/,/)-"R,S,T"用分隔符逗号分割字符串,并保存在数组中a,所以它变成a[1] = R, a[2] = S, a[3] = T
f=$2~/^H[0-9]+$/-f是变量,验证 regexp $2 ~ /^H[0-9]+$/,返回布尔状态。如果返回true则变量f将为 true,否则false
$2 = $2 a[++c]如果上述为真,则修改第二个字段,这样第二个字段将是现有值加上数组a值,对应索引(c),++c是预增变量
!f{c=0}如果变量f为假,则重置变量c,而不是连续的。
1最后执行默认操作,即打印当前/记录/行,print $0。要了解 awk 的工作原理,请尝试使用awk '1' infile,它将打印所有记录/行,而不会awk '0' infile打印任何内容。零以外的任何数字都是true,这会触发默认行为。
检测结果:
$ cat infile
1ECLI H813 98 7.529 8.326 9.267
1ECLI H813 99 7.427 8.470 9.251
1ECLI C814 100 7.621 8.513 9.263
1ECLI H814 101 7.607 8.617 9.289
1ECLI H814 102 7.633 8.489 9.156
1ECLI H814 103 7.721 8.509 9.305
1ECLI C74 104 8.164 8.733 10.740
1ECLI H74R 105 8.247 8.690 10.799
$ awk 'BEGIN{split("R,S,T",a,/,/)}f=$2~/^H[0-9]+$/{$2 = $2 a[++c]}!f{c=0}1' infile
1ECLI H813R 98 7.529 8.326 9.267
1ECLI H813S 99 7.427 8.470 9.251
1ECLI C814 100 7.621 8.513 9.263
1ECLI H814R 101 7.607 8.617 9.289
1ECLI H814S 102 7.633 8.489 9.156
1ECLI H814T 103 7.721 8.509 9.305
1ECLI C74 104 8.164 8.733 10.740
1ECLI H74R 105 8.247 8.690 10.799
Run Code Online (Sandbox Code Playgroud)
如果您想要更好的格式,例如tab或其他字符作为字段分隔符,那么您可以使用下面的一个,修改OFS变量
$ awk -v OFS="\t" 'BEGIN{split("R,S,T",a,/,/)}f=$2~/^H[0-9]+$/{$2 = $2 a[++c]}!f{c=0}{$1=$1}1' infile
1ECLI H813R 98 7.529 8.326 9.267
1ECLI H813S 99 7.427 8.470 9.251
1ECLI C814 100 7.621 8.513 9.263
1ECLI H814R 101 7.607 8.617 9.289
1ECLI H814S 102 7.633 8.489 9.156
1ECLI H814T 103 7.721 8.509 9.305
1ECLI C74 104 8.164 8.733 10.740
1ECLI H74R 105 8.247 8.690 10.799
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
126 次 |
| 最近记录: |