簡體   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