2013-08-01 60 views
0

我有一個CSV文件,我需要過濾掉一些不包含某些值的行。因此,我不關心這些行,並希望刪除它們或將命令的結果放入新的csv文件中。當4列有空值時從CSV文件中刪除行

這是我的CSV文件的格式:

employeeid,time,homephone,workphone,ssn,insurance,address,state,salary,position,rank,boss,hiredate 

現在也有一些行有沒有一些信息,這些領域。我將如何執行awk或sec命令來讀取csv文件中的所有行,並只將沒有字段爲空的行放入另一個文件中?或者是否有可能用notthere這樣的詞來代替每個,,?我有一些詞替換在這裏,但這不是100%的工作。

到目前爲止,我有這樣的事情:

sed -e 's/^,/notthere,/' old.csv > new.csv 

這幾乎什麼也不做,我期待的。如果有人能幫助我,我將不勝感激。我不是那種使用linux命令的經驗。

謝謝!

回答

1

好像你也可以grep文件中連接的逗號:

grep -v ',,' somefile.csv > newfile.csv 

編輯:剛剛意識到你有開始和結束的領域,你也想檢查。我們可以包括那些與正則表達式,像這樣:

grep -vE ',,|^,|,$' somefile.csv > newfile.csv 

grep -v手段「逆」,換句話說:打印不這些模式匹配的所有行:兩個逗號一起,在該行的開頭逗號,行末的逗號。這裏的|表示「或」。

+0

非常感謝!做事的相反方式很有趣,同時也適用。現在我可以繼續使用我需要的其他代碼。謝謝! – Tastybrownies

+0

沒問題。我實際上一直使用'grep -v'和'grep -vE'。 – erewok

0

這應該工作:

sed -e 's/,,/,notthere,/' old.csv > new.csv 
+1

應該添加'-e '/ ^,/ notthere,/'-e's /,$ /,notthere /''檢查第一個字段和最後一個字段的空格 –

0

一些樣本數據會有所幫助,但嘗試這種跳過線與空字段:

awk -F , '{n=0; for (i=1;i<=NF;i++) if ($i=="") n++} n==0' filename 

其可讀性

awk -F , '{ 
    empty=0 
    for (i=1; i<=NF; i++) { 
     if ($i == "") { 
      empty++ 
     } 
    } 
    if (empty == 0) { 
     print 
    } 
}' filename 
0

值得注意的是,上面的例子在整個行中都是「grepping」。另一種方法是使用awk搜索不存在的特定列,如下所示。給定逗號分隔的文件,下面的腳本僅打印第2列中具有空值的行,由$2表示。部分的print $0表示打印整個行。

打印的所有行,其中第2欄是空的,重定向到new.csv

awk -F "," '$2 !~ /./ {print $0}' old.csv > new.csv 

另一個相關的例子中,打印第3欄當只有它匹配正則表達式[0-9]

awk -F "," '$3 ~ /[0-9]/ {print $3}' old.csv > new.csv