以下に示すように、データを含む大容量ファイル(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
上記の注意事項:
- コードブロック全体が単にif / thenの場合、条件はコードブロックのフィルタとして使用できます。したがって、次のもの
$4 == "E:" {$4 = ""}
とまったく同じです。{if ($4 == "E:") {$4 = ""}}
- 「then」ステートメントが1つしかない場合でも、コードブロックに「then」ステートメントを含めることをお勧めします
if ($4 == "E:") {$4 = ""}
。if ($4 == "E:") $4 = "";
-F
値セットは、最初のファイルの最初の行を考慮する前に、すべての変数の値を設定するために使用できますFS
。 (おそらく知っています。)ブロックを使用して同じことを実行できます。スクリプトが自己完結したい場合は、この点に注意してください。-v
awk
BEGIN
awk
1
line in を印刷する理由は常に true と評価される条件 (フィルタ) であり、フィルタにコードブロックが添付されていない場合のデフォルト動作はawk
to であるためです。したがって、それ自体はorまたはjustと同じです。awk
print $0
1
1 {print}
1 {print $0}
{print}
sub
最後の変形では、正規表現(文字列の先頭、文字列の終わり)をinに置き換える関数を使用しました。/^E:$/
E:
""
$4
sub
関数は置換された回数(1または0、複数の置換を作成する場合)を返すため、関数の結果に1を追加して常に真のパターンがあることを確認して、置換が印刷されているかどうかを確認することでこの問題を解決gsub
できます。sub
結果ライン。以下はゴルフ版のコードです。後でメンテナンスするスクリプトにコードを入れる場合は、初心者にはお勧めできません。
awk -F, -v OFS=, 'sub(/^E:$/,"",$4)+1' data.final
:)