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()
機能は実装されていません。これの説明は次のとおりです。awk
Solaris マニュアル。
/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
使用します。awk
PATH="$(/usr/xpg4/bin/getconf PATH):$PATH"