2016-01-20 46 views
0

我嘗試過使用cat /home/kgh/abc.CSV | awk -F, '$2 ~ /^[[:digit:]]+$/'。它在列級檢查條件。使用sed/grep從csv文件中刪除所有非整數行

cat /home/kgh/abc.CSV 
1,010116085134,125,125,124,123, 000,00,232,28,294522,077,041755,0074,0013 
1,010116085139,125,125,124,123,-012,00,232,28,294522,077,041755,0074,0013 
1,010116085144,125,125,124,123, 000,00,232,28,294522,077\82,041755,0074,0013 
1,010116085149,125,125,124,123,^@000,00,232,28,294522,088,041755,0074,0013 
2,010116084424,15954,15593,14034 
2,010116084616,15651,15366,12804 

預期的O/P

1,010116085134,125,125,124,123, 000,00,232,28,294522,077,041755,0074,0013 
1,010116085139,125,125,124,123,-012,00,232,28,294522,077,041755,0074,0013 
2,010116084424,15954,15593,14034 
2,010116084616,15651,15366,12804 

我不能夠在行級檢查作爲cat /home/kgh/abc.CSV | awk -F, '$0 ~ /^[[:digit:]]+$/'。我不能把這個條件放在其他列上,因爲它在每一行中包含不同數量的列。我只想檢查我的csv文件中的數字數據,否則我想從我的csv文件中刪除該行。是否有任何有效的方法來做到這一點?謝謝。

編輯

我擔心,爲什麼下面提及的解決方案沒有與sed工作和grep

[email protected]:/home/kgh/# cat abc.CSV 
1,010116084135,118,115,113,115,-368,09,225,28,294579,077,044677,0074,0013 
1,010116084146,000,000,000,000,000,09,227,28,294536,077,044271,0074,0013 
1,010116084151,122,121,118,119,-099,05,228,28,294547,077,044150,0074,0013 
1,010116084156,121,117,117,116,-244,^@06,228,28,294557,077,044047,0074,0013 
[email protected]:/home/kgh# sed -n '/^[0-9, -]*$/p' abc.CSV 
[email protected]:/home/kgh# sed -rn '/^-?[0-9]+(, ?-?[0-9]+)*$/p' abc.CSV 
[email protected]:/home/kgh# grep -v '[^0-9, -]' abc.CSV 

我缺少什麼?

被修改

file abc.CSV 
abc.CSV: ASCII text, with CRLF line terminators 

我打開的文件,以查看在vi CRLF行終止使用:set list

1,010116084135,118,115,113,115,-368,09,225,28,294579,077,044677,0074,0013$ 
1,010116084146,000,000,000,000,000,09,227,28,294536,077,044271,0074,0013$ 
1,010116084151,122,121,118,119,-099,05,228,28,294547,077,044150,0074,0013$ 
1,010116084156,121,117,117,116,-244,^@06,228,28,294557,077,044047,0074,0013$ 

因此使用sed或grep的任何結果。

我已經刪除了CRLF行終止符,現在它使用grep和sed。

sed 's/'"$(printf '\015')"'//g' abc.CSV | sed '/[^0-9, -]/d' 
1,010116084135,118,115,113,115,-368,09,225,28,294579,077,044677,0074,0013 
1,010116084146,000,000,000,000,000,09,227,28,294536,077,044271,0074,0013 
1,010116084151,122,121,118,119,-099,05,228,28,294547,077,044150,0074,0013 
+1

我猜你的CSV文件有DOS行結束符。使用'dos2unix'(或許多其他選項之一;谷歌周圍)並再試一次,或者更新你的正則表達式以允許這個外星人角色。除非您正在尋求驗證例如,否則應該只需要簡單的'grep'。列數,或者除去無效數字,如1.2.3或0--0。 – tripleee

+0

非常感謝您爲此突出顯示:) – Aashu

+0

您是否仍然有問題,或者您是否可以接受提議的解決方案之一,以便這個問題不再出現未解決的問題?謝謝。 – tripleee

回答

1

隨着GNU sed的:

sed -n '/^[0-9, -]*$/p' abc.csv 

如果你要編輯的文件 「到位」 添加的sed的選項-i

輸出:

 
1,010116085134,125,125,124,123, 000,00,232,28,294522,077,041755,0074,0013 
1,010116085139,125,125,124,123,-012,00,232,28,294522,077,041755,0074,0013 
2,010116084424,15954,15593,14034 
2,010116084616,15651,15366,12804 

參見:The Stack Overflow Regular Expressions FAQ

+0

爲什麼我無法使用它? – Aashu

0

此打印出由數字的所有行,用逗號和可選的空間分開;數字由可選的一元減號前綴。

$ sed -rn '/^-?[0-9]+(, ?-?[0-9]+)*$/p' infile 
1,010116085134,125,125,124,123, 000,00,232,28,294522,077,041755,0074,0013 
1,010116085139,125,125,124,123,-012,00,232,28,294522,077,041755,0074,0013 
2,010116084424,15954,15593,14034 
2,010116084616,15651,15366,12804 

沒有擴展的正則表達式(-r),括號必須被轉義,?變得\{0,1\}+成爲\{1,\}

1

使用grep:

grep -v '[^0-9, -]' abc.CSV 
0

的另一種方法用grep: 的grep '^ [0-9, - ] * $' ABC。以csv

0

除了sed打印命令,您也可以使用該sed刪除命令來刪除包含超過'0-9, -'其它字符的行。例如:

$sed '/[^0-9, -]/d' abc.csv 
1,010116085134,125,125,124,123, 000,00,232,28,294522,077,041755,0074,0013 
1,010116085139,125,125,124,123,-012,00,232,28,294522,077,041755,0074,0013 
2,010116084424,15954,15593,14034 
2,010116084616,15651,15366,12804 

注:到「編輯就地」,你可以使用'-i'選項。此外,您可以使用'-i.bak'選項使sed創建爲abc.csv.bak,其中包含原始文件,其中包含abc.csv中的修改文件。

+0

與-i選項,它獲得ovewrite作爲空文件,因爲我沒有得到任何o/p之後sed'/ [^ 0-9, - ]/d'abc.csv – Aashu

+0

你正在使用什麼操作系統?我在Linux上使用完全相同的文件和表達式,它按照指示工作。你在Mac上嗎? –

+0

我正在使用ubuntu-12.04 – Aashu