以下は私のファイルの内容であり、以下は私の要件です列番号1と列番号5の値に基づいて、列7の値を「1」に置き換えたいと思います。
例えば:
- 列 1 が「変更」、列 5 が「延期」の場合、列 7 の値を「1」に置き換えます。
- 列 1="change" および列 5="defererence" の場合、列 7 の値を "1" に置き換えます。
- それ以外の場合、行は何もせず、そのままにしておきます。
入力ファイル:
Change|sinmg|1234|ewfew|def|fdfd|JAMES|rewr|ROBERT|3|fe
Change|sinmg|2345|ewfew|defer|VENKTRAAAMMAMAMAMMAMA|3|rewr|BEAEY|3|
noChange|sinmg|2323|ewfew|def|VENKTRAAAMMAMAMAMMAMA|3|rewr|BEAEY|3|fe
Change|sinmg|3456|ewfew|defer|VENKTRAAAMMAMAMAMMAMA|3|rewr|BEAEY|3|
Change|sinmg|2345|ewfew|defererence|VENKTRAAAMMAMAMAMMAMA|3|rewr|BEAEY|3|
上記は説明を簡単にするための単なるサンプルです。ただし、ファイルの値と照合するために、ファイルから列 1 と列 5 の値を渡したいと考えています。一致する場合は、列 7 のみを値「1」に置き換えます。それ以外の場合は行で何もせず、そのままにしておきます。
いくつかのオプションを試しましたが、必要な結果を得ることができませんでした。
perl -F'\|' -i -lape 'if ($F[0] eq "change" && $F[4] eq "defer") { s/$F[6]/1/g;}' file_name
上記のコマンドは、フィールドに関係なく、ファイル内の 3 のすべての値を置き換えています。しかし、ループで1列目と4列目に異なる値を渡すことで、1列目と4列目に基づいて6列目の値のみを置き換えたいです。
詳細情報の追加:
上記で私が述べたように、上記の例は、誰もが要件を理解できるようにするための私の問題の最も単純な形式です。一致する列1と列5の値のリストを持っている「listfile」という名前のファイルがあります。ソースファイルの列 1 と列 5 の値がファイル "listfile" から渡された値と一致する場合、解決策は列 7 の値を "1" に置き換える必要があります。それ以外の場合は、ソース ファイルの行に対して何もせず、そのままにしておきます。
以下を実行しようとしましたが、必須を達成できませんでした。
#!/usr/bin/ksh
for line in $(cat dir/listfile)
do
VAR1=$(echo $line | nawk -F"|" '{print $1}')
VAR2=$(echo $line | nawk -F"|" '{print $2}')
nawk -F"|" 'BEGIN {OFS="|"} {if($1!="'"$VAR1"'" && $5!="'"$VAR2"'") {$8="1"; print $0;} else {print $0;}}' dir/sourcefile >> dir/sourcefile_REVISED
done
元のソース ファイルと、7 番目の列を置き換えた後の改訂されたソース ファイルの間のレコード数は同じである必要があります。唯一のことは、ファイル listfile の列 1 と 5 のすべての値です。列 7 の値を「1」に置き換える必要があります。
ありがとう、