17の列と100万の行を持つcsvファイルがあります。特定の文字列に対して列16を検索し、その文字列のすべてのインスタンスを別の文字列に置き換えたいと思います。私のプログラムの残りの部分はbashスクリプトを使用しているので、Pythonの検索と置換の代わりにawkを使用したいと思います。現在のオペレーティングシステムはRhel6です。
私のデータのサンプル出力は次のとおりです。
SUBSCRIBER_ID|ACCOUNT_CATEGORY|ACCOUNT_ACTIVATION_DATE|PACKAGE_NAME|PACKAGE_TYPE|DURATION|ACTIVE_DATE|INACTIVE_DATE|STB_NO|PRIMARY_SECONDARY|MODEL_TYPE|VC_NO|MULTIROOM|STB_TYPE|IPKG|SERVICE_STATE|CURRENT_STATUS
1001098068|ResidentialRegular|01/20/2007|Annual package 199 May17 pack|Basic Package|Annual|08/28/2017||027445053518|Primary|Pace - 31|000223871682|Yes|AMP|Package 199 pack|Market1|Active
1001098068|ResidentialRegular|01/20/2007|Annual Pack|Premium Package|Annual|08/28/2017||027445053518|Primary|Pace - 31|000223871682|Yes|AMP|English Movies pack|Market1|Active
1001098068|ResidentialRegular|01/20/2007|Annual SingleUnit Jun17 Pack|Secondary Pack|Annual|08/28/2017||032089364015|Secondary|Kaon|000017213968|Yes|AMP|SingleUnit|Market2|Active
Market1
16列が市場であるところをに変更したいと思いますMarketPrime
。ファイル名は次のとおりです。marketinfo_2018-06-26.csv
次のコードを試しました。
awk -F '| +' '{gsub("Market1","MarketPrime",$16); print}' OFS="|" marketinfo_2018-06-26.csv > marketinfo_2018-06-26.csv
実行後は出力はありませんが、文字列はMarket1
残ります。
ベストアンサー1
awk -F '|' -v OFS='|' '$16 == "Market1" { $16 = "MarketPrime" }1' file.csv >new-file.csv
コードの唯一の実際の問題は、入力ファイル区切り文字を空白|
だけでなく空白にも設定することです。これにより、スペースはデータのフィールド区切り文字として計算され、正しいフィールド番号を特定することが困難になります(一部のフィールドには可変数のスペースが含まれているため)。
また、読み込み時に使用したのと同じファイル名にリダイレクトすることはできません。これにより、シェルが最初に出力ファイルを切り取り(空)プログラムからawk
読み取るデータがなくなります。
コードで正規表現の置換を実行します。大丈夫です。ただし、16番目のフィールドがまたはに等しいMarket12
場合は、アンカーのTheMarket1
欠落によって置換がトリガーされることに注意してください。^Market1$
代替式を使用するか、文字列比較を使用する方が安全です。
上記のコマンドはフィールド区切り文字としてawk
機能し、|
16番目のフィールドと文字列比較を実行します。フィールドが裏面Market1
に設定されますMarketPrime
。
1
コードの終わりの終わりは、awk
すべてのレコード(変更または変更されていない)が印刷されるようにします。