繁体   English   中英

sed,awk或perl过滤不完整的数据列

[英]Sed, awk or perl to filter incomplete data column

自然语言处理的新手。 我有包含约一百万行的csv文件。 我想过滤掉不包含任何数据的第三行。 例如

user1,user2, it really is  
user3,user4, oh nothin  
user5,user9, 
user7,user8,  
user9,user10,  
user11,user12, i know im in 
user13,user14, 
user15,user16, 
user17,user18, i think that might     
user19,user20, what u 
user21,user22, hmmm you never know 
user23,user24, nicee

预期产量

user1,user2, it really is 
user3,user4, oh nothin   
user11,user12, i know im in  
user17,user18, i think that might     
user19,user20, what u  
user21,user22, hmmm you never know  
user23,user24, nicee

我努力了

awk -F',+' 'NF == 3' file > file    

但是,不起作用

您可以使用以下awk:

awk -F ',[[:blank:]]*' '$NF!=""' file
user1,user2, it really is
user3,user4, oh nothin
user11,user12, i know im in
user17,user18, i think that might
user19,user20, what u
user21,user22, hmmm you never know
user23,user24, nicee

'$NF'!=""实际上是检查是否填充了第三个字段的条件。

PS:您不能真正做到:

awk -F ',[[:blank:]]*' '$NF!=""' file > file

由于输入文件和重定向文件相同,因此最终将得到0字节文件。

更好的是:

awk -F ',[[:blank:]]*' '$NF!=""' file > file.out && mv file.out file

在Perl中,这会打印一行,除非它以逗号和空格结尾。

perl -ne'/,\s*$/ or print' file

输出

user1,user2, it really is
user3,user4, oh nothin
user11,user12, i know im in
user17,user18, i think that might
user19,user20, what u
user21,user22, hmmm you never know
user23,user24, nicee

您没有说是否反对使用vim,但是可以将文件加载到vim中,然后执行以下操作:

:g/,\s\+$/d

:g是vim的全局变量(对整个文件进行操作)

语法是:g / pattern / command

正斜杠之间是正则表达式模式。 在这里,我们寻找一个逗号,后面跟着我们可以找到的最大空格(\\ s +),直到我们到达行尾($)。

当正则表达式匹配时,命令“ d”表示“删除行”。

最后:

:wq

写入文件(w)并退出(q)。

您输入的每行有3个字段(因为总有2逗号),所以NF总是3.你要测试的$ NF是空的内容,NF的不是值为3,另外,不要做cmd file > file的任何命令外壳可以做> file的前部分cmd file的一部分,因此扎普你的输入文件之前,它已经被读取cmd

你需要:

awk -F', *' '$NF!=""' file > tmp && mv tmp file

顺便说一句,这个问题/示例与自然语言处理完全无关。

这不是那么优雅,但是也许更清晰,更容易修改字段编号:

#!/usr/bin/perl
open IN,$ARGV[0];
while(<IN>){
    @line = split(",",$_);
    if($line[2] =~ /\S/){
        print;
    }
}

$ ARGV [0]是表中文件的名称; \\ S表示字段#2(字段从0开始编号)中的任何字符(非空白)。

这是我有意选择的一个Perl答案,以演示-a autosplit和-F字段定界符选项的用法:

perl -anF, -e 'print if $F[2] =~ /\S/' file > file.out

但是在这种特殊情况下,我可能更喜欢grep

grep -E -v ',\s*$' file > file.out

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM