2017-07-04 14 views
0

値のないフィールドのキーワードがNULLになるテーブルをMySQLからエクスポートします。SedはNULLを削除しますが、NULLが空または値なしの場合のみ

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

私は自動的に正しく日付の列にNULLを削除しますsedのワンライナーを使用して、NULLの出現をすべて削除するスクリプトを書いている:

sed -i 's/NULL//g' 

はしかし、どのように我々は、IF扱いますか私たちは次のことがありますか?でも「ALA PUHU MINULLEは」間違っていた、「ALA PUHU MIE」になるだろうどこ

| 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の出現をすべて置き換えるには、削除されます。

正規表現を使用するとおそらくルールを適用すると便利だと思いますか?しかしもしそうなら、 "DJ Null Bee"は影響を受けるか、それとも "DJ Bee"になるのだろうか?望ましい結果は本当にする必要があります:それは別の言語で異なる意味するので、NULLが任意のデータベースのための特別なキーワードですが、DJ NULL自分自身を呼び出してからの停止誰もが存在しない、またはワードNULLを持っていることを考えると

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

これを解決する方法についてのご意見はありますか?任意の提案が歓迎された。ありがとうございました!

+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

ええ、例えば 'COALESCE(name、" ")'を使ってNULLを空文字列に変換してください。 –

答えて

2

必要なのは、次のとおりです。sedの任意のPOSIXに動作します

$ 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 | 

各試合はあなたが| NULL | NULL |を持っているときに真ん中|| NULL |の試合で消費されるので、残っているすべては| NULL |と一致していませんNULL |で試合中の文字のすべてを消費するのであなたは、二回の置換を行う必要があります| NULL |に一致する2つのパスが必要です。

+0

ありがとうございます。私がこれを2度やらなければならないという考えは、あなたが説明したように、フィッティングしていました。 pipe-space * NULLspace-pipeの代わりに、上記の[[:space:]]をCTRL + Vで置き換えた後、Tabキーを押してaを挿入すると、タブ区切り文字(非印字文字)タブ。 – 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と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 | 
関連する問題