awkを使用して行を区切る方法

awkを使用して行を区切る方法

csvファイルで行を区切る方法は次のとおりです。

(12,'hello','this girl,is lovely(adorable \r\n actually)',goodbye),(13,'hello','this fruit,is super tasty (sweet actually)',goodbye)

以下には2つの異なる行があります。

(12,'hello','this girl,is lovely(adorable \r\n actually)',goodbye)
(13,'hello','this fruit,is super tasty (sweet actually)',goodbye)

私は以下を使用しようとしています:

awk -F"[()]" '{print $2}' test.csv 

しかし、うまくいかず、複数行がありません。

データは実際にはSQLクエリであるため、データを抽出した後、コンマ(後ろ)と前(行区切り文字)を使用して別の行に変換する必要があります。

答え1

GNUを使用するsed(サンプル入力はというファイルに保存されます./input):

$ sed -e 's/),(/)\n(/g' ./input
(12,'hello','this girl,is lovely(adorable \r\n actually)',goodbye)
(13,'hello','this fruit,is super tasty (sweet actually)',goodbye)

これにより、すべてのコンマが改行文字に変わります),(

警告する:対応する文字シーケンスが実際のデータに表示されると、そこでも変更されます。

で同じことができますが、以下をawk使用するよりも利点はほとんどありませんsed

$ awk 'gsub(/\),\(/,")\n(",$0)' ./input
(12,'hello','this girl,is lovely(adorable \r\n actually)',goodbye)
(13,'hello','this fruit,is super tasty (sweet actually)',goodbye)

awk機能が必要な入力ラインに対して追加の処理を実行したくない場合sed

答え2

この awk コマンドは目的の操作を実行します。

awk -F '),' '{ print $1")" "\n" $2}' source.csv

結果:

(12,'hello','this girl,is lovely(adorable \r\n actually)',goodbye)
(13,'hello','this fruit,is super tasty (sweet actually)',goodbye)

答え3

cat test.csv | tr -d "()" | sed 's/goodbye/goodbye\n/g'

  • sedは文字列を翻訳しますさようなら改行入力(\N)。sed 's/goodbye/\n/g'次のコマンドを使用してbyeを除外できます。「G」最初の一致だけでなく、すべての行に対してこれを行います。
  • trオプションで角かっこを削除します(trを使用して削除せずに他のものに変換できます)。

答え4

Pythonで試してみました。

a=(12,'hello','this girl,is lovely(adorable \r\n actually)',goodbye),(13,'hello','this fruit,is super tasty (sweet actually)',goodbye)

#!/usr/bin/python
import re
b=a.split("),")
for i in range(0,len(b),1):
    if i == 0:
        d=")"
        print b[i]+d
    else:
        print b[i]

出力

(12,'hello','this girl,is lovely(adorable \r\n actually)',goodbye)
(13,'hello','this fruit,is super tasty (sweet actually)',goodbye)

関連情報