2017-07-04 91 views
0

從MySQL導出表,其中沒有值的字段將具有關鍵字NULL。Sed刪除NULL,但僅當NULL表示空或無值時

| id | name | nickname | origin | date | 
| 1 | Joe | Mini-J | BRAZIL | NULL | 

我寫了一個腳本,以使用一班輪sed的,這將刪除日期欄正確的NULL自動去掉NULL的所有實例:

sed -i 's/NULL//g' 

然而,我們如何處理IF我們有以下幾點?

| id | name | nickname | origin | date | 
| 1 | Joe | Mini-J | BRAZIL | NULL | 
| 2 | Dees | DJ Null Bee| US| 2017-04-01 | 
| 3 | NULL AND VOID | NULLZIET | NULL| 2016-05-13 | 
| 4 | Pablo | ALA PUHU MINULLE | GERMANY| 2017-02-14 | 

顯然,全局搜索和替換NULL的所有事件都將被刪除,其中甚至「ALA PUHU MINULLE」將成爲「ALA PUHU MIE」,這是不正確。

我想使用正則表達式可能會適用於規則?但如果是這樣,「DJ Null Bee」會受到影響,還是會變成「DJ Bee」?理想的結果應該真正:

| id | name | nickname | origin | date | 
| 1 | Joe | Mini-J | BRAZIL | | 
| 2 | Dees | DJ Null Bee| US| 2017-04-01 | 
| 3 | NULL AND VOID | DJ Null Bee| | 2016-05-13 | 
| 4 | Pablo | ALA PUHU MINULLE | GERMANY| 2017-02-14 | 

鑑於NULL爲任何數據庫的一個特殊的關鍵字,但沒有阻止任何人自稱爲一個DJ NULL,或有字NULL,因爲它用另一種語言意味着不同。

有關如何解決此問題的任何想法?歡迎任何建議。謝謝!

+0

使用awk或類似的理解字段。 – 123

+0

或者可能有一種方法可以用mysql自己做...有類似的問題問sday:https://stackoverflow.com/questions/44889613/replace-an-entire-field-value-in-a-file -using-awk-or-other – Sundeep

+0

是的,例如使用'SELECT COALESCE(name,「」)'將NULL轉換爲空字符串。 –

回答

2

所有你需要的是:

$ sed 's/|[[:space:]]*NULL[[:space:]]*|/| |/g; s/|[[:space:]]*NULL[[:space:]]*|/| |/g' file 
| id | name | nickname | origin | date | 
| 1 | Joe | Mini-J | BRAZIL | | 
| 2 | Dees | DJ Null Bee| US| 2017-04-01 | 
| 3 | NULL AND VOID | NULLZIET | | 2016-05-13 | 
| 4 | Pablo | ALA PUHU MINULLE | GERMANY| 2017-02-14 | 

這將在sed任何POSIX工作。

你要做的替代兩次,因爲每場比賽消耗了所有的字符在比賽,所以當你有| NULL | NULL |中間|被對手在| NULL |消耗,因此,所有剩下的就是NULL |不匹配| NULL |,所以你需要2次傳球來匹配每個| NULL |

+0

謝謝你。正如你所描述的那樣,我必須這樣做兩次的想法很合適。用CTRL + V寫出上面的替換[[:space:]],然後用TAB鍵插入一個空格來替代pipe-space * NULLspace-pipe,我想指出那些使用製表符分隔符(不可打印的字符)標籤。 – dat789

0
$ cat mysql.txt | sed -r 's/(\|)NULL(\|)/\1\2/g' 
| id | name | nickname | origin | date | 
| 1 | Joe | Mini-J | BRAZIL | | 
| 2 | Dees | DJ Null Bee| US| 2017-04-01 | 
| 3 | NULL AND VOID | NULLZIET | NULL| 2016-05-13 | 
| 4 | Pablo | ALA PUHU MINULLE | GERMANY| 2017-02-14 | 

只會刪除由打開和關閉管道符號單獨分隔的資本NULL字段。

它會保留你的起源欄「| NULL |」在「| 3 | NULL AND VOID | DJ Null Bee | NULL | 2016-05-13 |」以及。

+1

您也可以在兩邊使用'*'或'[[:blank:]] *'使管道內的空白可選。 –

+3

當它不應該(簡單地固定)時,它會刪除分隔符,並且它僅更改'|中的第一個NULL。 NULL | NULL |'(不那麼容易修復) – hvd

+0

除非使用'-r/E'標誌,'\ |'不是一個文字'|'。另外你爲什麼逃離空間。 – 123

0

用AWK:

awk -F\| '{ for (i=2;i<=NF;i++) { if ($i == " NULL ") { printf "| " } else if ($i == " NULL") { printf "| DJ Null Bee " } else { printf "|"$i } } printf "\n" }' filename 

使用管道作爲字段分隔符,請在各字段,然後檢查場等同於「NULL」如果是的話,打印什麼。然後檢查該字段是否等於「NULL」如果它打印出「DJ Null Bee」,則按原樣打印該字段。

0
awk '{sub(/BRAZIL \| NULL/,"BRAZIL \| ")sub(/NULLZIET \| NULL/,"DJ Null Bee\| ")}1' file 

| id | name | nickname | origin | date | 
| 1 | Joe | Mini-J | BRAZIL | | 
| 2 | Dees | DJ Null Bee| US| 2017-04-01 | 
| 3 | NULL AND VOID | DJ Null Bee| | 2016-05-13 | 
| 4 | Pablo | ALA PUHU MINULLE | GERMANY| 2017-02-14 |