特定の列の検索と置換

特定の列の検索と置換

sed私はUnix(Solaris)でこれがうまくいかない理由がわからないので、特定の列の検索と置換を使用するのが好きawk gsub()ですsed

サンプル:

122|abc|ds,we||wrqg
145|dw|ett,335||nxd
166|rotl|qqqp,eoepepe||ge
776|gge|022||pp
039|pot|011a||lot

3番目の列では、パイプ(),のカンマ()を変更したいと思います。|

を使用しようとすると、gsub()次のエラーが発生します。

awk '{gsub(",","|",$3)}1' in.file > out.file

awk: syntax error near line 1
awk: illegal statement near line 1
awk: syntax error near line 1
awk: bailing out near line 1

また、それをマイデータベース(Oracle)にインポートします。,データをに置き換えると、変更された|データレコードは同じフィールドに存在しません。どうすればいいですか?

出力は次のとおりです。

122|abc|ds|we|wrqg
145|dw|ett|335|nxd
166|rotl|qqqp|eoepepe|ge
776|gge|022||pp
039|pot|011a||lot

誰でもこれは本当に必要です。

ベストアンサー1

Solaris/usr/bin/awkのさまざまな機能のサポートは厳しく制限されています。特に、このgsub()機能は実装されていません。これの説明は次のとおりです。awkSolaris マニュアル

/usr/xpg4/bin/awkこれには(またはnawk「new awk」)を使用する必要があります。

また、コードはフィールド区切り文字を指定しないため、awk誤って$3スペースで区切られた3番目のフィールドを生成するのに十分なデータがない限り、何も含まれません。同様に、出力フィールド区切り文字を指定しないため、変更された行のフィールドはスペースで区切られます。

代わりに:

/usr/xpg4/bin/awk -F '|' 'BEGIN { OFS=FS } { gsub(",", "|", $3); print }' file

これをSolarisで常にデフォルトにするには、シェルの起動ファイルでそれを/usr/xpg4/bin/awk使用します。awkPATH="$(/usr/xpg4/bin/getconf PATH):$PATH"

おすすめ記事