[英]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.