列のテキストを置き換える方法

列のテキストを置き換える方法

以下に示すように、データを含む大容量ファイル(2GB以上)があります。

12,324,32342,E:fsdsf,23432,34534,45345,324

13,3224,342,E:werwefsdsf,23432,34534,45345,324

121,3244,33442,E:,23432,34534,45345,324

E:ここでは、4番目の列でスペースが見つかるすべての場所を置き換える必要があります""が、後で文字列を見つけるたびにE:そのまま残す必要があります。

予想される出力は次のとおりです。

12,324,32342,E:fsdsf,23432,34534,45345,324

13,3224,342,E:werwefsdsf,23432,34534,45345,324

121,3244,33442,,23432,34534,45345,324

ベストアンサー1

あなたの構文はほぼ正しい。で文字列の同一性をテストするには、二重等awk号を使用します。==到着値を指定する、単一の等号を使用します。

したがって、これを使用すると、if ($4 == "E:")目的の結果が得られます。

完全なコマンドは次のとおりです。使用したコマンドと文字の違いが1つだけであることに注意してください。これが唯一の間違いです。

awk -F , '{ if ($4 == "E:") $4="";}1' OFS=, data.final

いくつかの異なる構文と異なるアプローチを示すために、次のバージョンはまったく同じです。

awk -F, -v OFS=, '$4 == "E:" { $4 = "" }; 1' data.final

awk 'BEGIN { FS=OFS="," }; $4 == "E:" { $4 = "" }; {print}' data.final

awk -F, -v OFS=, '{sub( /^E:$/, "", $4); print}' data.final

上記の注意事項:

  1. コードブロック全体が単にif / thenの場合、条件はコードブロックのフィルタとして使用できます。したがって、次のもの$4 == "E:" {$4 = ""}とまったく同じです。{if ($4 == "E:") {$4 = ""}}
  2. 「then」ステートメントが1つしかない場合でも、コードブロックに「then」ステートメントを含めることをお勧めしますif ($4 == "E:") {$4 = ""}if ($4 == "E:") $4 = "";
  3. -F値セットは、最初のファイルの最初の行を考慮する前に、すべての変数の値を設定するために使用できますFS。 (おそらく知っています。)ブロックを使用して同じことを実行できます。スクリプトが自己完結したい場合は、この点に注意してください。-vawkBEGINawk
  4. 1line in を印刷する理由は常に true と評価される条件 (フィルタ) であり、フィルタにコードブロックが添付されていない場合のデフォルト動作はawkto であるためです。したがって、それ自体はorまたはjustと同じです。awkprint $011 {print}1 {print $0}{print}
  5. sub最後の変形では、正規表現(文字列の先頭、文字列の終わり)をinに置き換える関数を使用しました。/^E:$/E:""$4

sub関数は置換された回数(1または0、複数の置換を作成する場合)を返すため、関数の結果に1を追加して常に真のパターンがあることを確認して、置換が印刷されているかどうかを確認することでこの問題を解決gsubできます。sub結果ライン。以下はゴルフ版のコードです。後でメンテナンスするスクリプトにコードを入れる場合は、初心者にはお勧めできません。

awk -F, -v OFS=, 'sub(/^E:$/,"",$4)+1' data.final

:)

おすすめ記事