awk CSVファイルの特定の列で文字列を検索して置換する

awk CSVファイルの特定の列で文字列を検索して置換する

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

Market116列が市場であるところをに変更したいと思います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すべてのレコード(変更または変更されていない)が印刷されるようにします。

おすすめ記事