首页 > 解决方案 > 在第一次匹配时删除第 N 列中特定数字之前的所有字符而不是最后一个

问题描述

我正在尝试从数据集中的第 5 列中删除一个随机字符块。

样本数据:

A | 12 | AA | 24 | Test to go and keep 192.168.1.1 > 192.168.2.1 | B

结果应如下所示:

A | 12 | AA | 24 | 192.168.1.1 > 192.168.2.1 | B

到目前为止我有这个:

awk 'BEGIN{FS=OFS="|"} {gsub(".*? 192","", $5 )} 1' file.txt

但是,这会删除最后一场比赛前第 5 列中的所有内容。

代码现在做了什么:

.168.2.11

我需要在第一场比赛不是最后一场之前删除所有内容

标签: linuxawkgsubless-unix

解决方案


使用您显示的示例,请尝试以下awk代码。|简单的解释是:为 Input_file 的所有行设置字段分隔符和输出字段分隔符。然后在第 5 个字段中用 NULL 全局替换空格和字母。根据显示的示例在第 5 个字段之前和之后添加空格,最后打印已编辑/未编辑的当前行。

awk 'BEGIN{FS=OFS="|"} {gsub(/[[:alpha:]]+|[[:space:]]+/,"",$5);$5=" "$5" "} 1' Input_file


编辑:如果您想在第 5 个字段中始终匹配 IP 地址 > IP 地址形式,那么只需尝试以下操作。

awk 'BEGIN{FS=OFS="|"} match($0,/([0-9]+\.){3}[0-9]+ > ([0-9]+\.){3}[0-9]+/){$5=substr($0,RSTART,RLENGTH)} 1' Input_file

推荐阅读