我需要验证和清理CSV中的一个字段.有IP地址的列,我只需要删除该列中的无效数据.

我try 了以下命令:

awk 'BEGIN{ FS=OFS="," }{ gsub(/^([0-9]{1,3}[\.]){3}[0-9]{1,3}$/,"", $3) }1' input.csv

输入文件文件

anna,new york,192.168.1.5,usa
james,denver,240.210.1.8,usa
peter,denver,colarado,usa
tommy,new york,10.2.8.3 male,usa

电流输出

anna,new york,,usa
james,denver,,usa
peter,denver,colarado,usa
tommy,new york,10.2.8.3 male,usa

预期yields

anna,new york,192.168.1.5,usa
james,denver,240.210.1.8,usa
peter,denver,,usa
tommy,new york,10.2.8.3,usa

此命令删除匹配的数据,但我需要相反的数据.如何仅删除IP列中不匹配的数据?

推荐答案

如何仅删除IP列中不匹配的数据?

您可以通过以下方式组合以下string functions:match substr来完成此任务

anna,new york,192.168.1.5,usa
james,denver,240.210.1.8,usa
peter,denver,colarado,usa
tommy,new york,10.2.8.3 male,usa

然后

awk 'BEGIN{FS=OFS=","}{$3=match($3,/([0-9]{1,3}[\.]){3}[0-9]{1,3}/)?substr($3,RSTART,RLENGTH):"";print}' file.txt

给出输出

anna,new york,192.168.1.5,usa
james,denver,240.210.1.8,usa
peter,denver,,usa
tommy,new york,10.2.8.3,usa

Explanation: I inform GNU AWK that , is both field separator (FS) and output field separator (OFS), 然后 for each line I use so called ternary operator condition?valueiftrue:valueiffalse, condition is if $3 does match regular expression, observe that I altered it slightly, so it does hold if IP is somewhere inside, rather than span whole column. If match found I use substr to get substring which does correspond to match using RSTART, RLENGTH which were set by match, otherwise I use empty string. After that I print whole line.

(tested in gawk 4.2.1)

Linux相关问答推荐

获取Perl文件::Tail开始在最后流传输文件

如何删除字符串中的`{{i:`and `}}`

在Bluez/Linux中,周期性与连续蓝牙设备发现的已知缺陷是什么?

为什么 `std::this_thread::yield()` 比 `std::this_thread::sleep_for(0s)` 慢 10 倍?

仅在 Linux 上出现 AWS RDS `flush tables` 错误的 mysqldump

如何在bash中用另一个整数变量增加一个整数变量?

为什么 Linux 不通过 TSS 使用硬件上下文切换?

如何将输出从 grep 传送到 cp?

使用特定目录作为根目录压缩目录的命令

在 C 中设置环境变量

用于 Linux 的 Less 编译器

使用sudo apt-get install build-essentials

C++:使用 longjmp 和 setjmp 安全吗?

什么是适用于 Linux 的好的 Prolog IDE?

基于shell中正则表达式的 colored颜色 突出显示输出

System.currentTimeMillis 是否总是返回一个值 >= 以前的调用?

我可以使用 awk 将所有小写字母转换为大写吗?

Hierarchical分层 ldd(1)

如何停止 Linux 上的不间断进程?

在 Docker 容器中运行的 JVM 的驻留集大小 (RSS) 和 Java 总提交内存 (NMT) 之间的差异