2017-04-05 1 views
-2

とありがとうございます。 私は全ての行は次のように開始する巨大なデータベースがあります。grepを使用して列を変更する方法

(497、36390、495、88、89、2、「xxdurango/A -...

(498、36391、1、93を、100、1、 'xxsalamanca ...

(499、36392、498、94、95、2、' xxsalamanca/NotIで...

(500、36393、498、96、97、2 、 'xxsalama ...

(501,36394,1,101,108,1' xxg ...

私は(#、#の後に3番目の列を変更する必要が

私はgrepの <を使用しようとしています。、。、> <(。、。、>

このすべてのgrepコマンドは、他の選択します行の値。

(BBEditを使用して)検索と置換を行いたい場合、3番目の列のすべてを同じ値に変更する必要があります。

を検索する必要があります。 ラインの初め、+ numeral1(、)numeral2(、)

か何かのように: ラインの初め、3digit数(、)4桁の数字(、)

何かヒント?

おかげ

+0

* <.,.,><(.,.,> * - 入力の山括弧はどこですか?あなたの入力を更新し、期待される結果を表示する – RomanPerekhrest

答えて

0

grepの使用は、あなたがオールオアナッシングを得るので、あなたはあなたが必要なフィールドの分離を得ることはありません、あなたがしたいパターンと一致する行を表示することができます。同様の正規表現を使用しますが、ストリームを編集することができるsedのような他のツールもあります(その名前はストリームエディタの縮小です)。例として、以下ではYYYYに3番目のフィールドを変更します

sed -r 's/^(\(([^,]+,){2})[^,]+,/\1 YYYY,/p' input_filename 

次のようにコマンドが故障した:

  • -r
  • s/は、検索の開始で拡張正規表現をオンに置換コマンド
  • ^行の先頭にアンカーを設定します。
  • ( b egins後ほど
  • \(を参照するグルーピングは、ラインの開始時にリテラル開口ブラケット
  • ([^,]+,)コンマに続くコンマない一又は複数の文字として読み込み、単一のユニットとして扱うされます
  • {2}
  • は、前のユニットが二回 )
  • 繰り返さ呼ばれるグループとしてここに全体のパターンを後
  • [^,]+,を閉じコンマに続く非カンマ、上記と同じであることを言う
  • /
  • \1は、パターンスペースの最初の基で置換され、交換(第2のコンマまでのすべて)
  • YYYYがある私たちのリテラル置換
  • /pに検索パターンからの変更を置換パターンを終了マークそしてさらに簡単になりawkのようなものを使用して変更

をプリントアウトすると言う:

awk -F, '{OFS=","; $3="YYYY"; print}' input_filename 

これはどのように動作するのか、かなりわかります。入力フィールドの区切りを-F,に設定してください。OFS=","は、printで使用される出力フィールドの区切り文字についても同様です。カンマを使用してフィールドを区切りますので、最初のフィールドにはカッコが入ります。 3番目のフィールドだけを変更したいので、これは問題ではありません。最初のフィールドを変更する場合は、そのフィールドを考慮する必要があります。

もう1つのオプションはcutpasteですが、これを練習問題として残しておきます。

関連する問題