以下是我的文件内容,以下是我的要求 基于第 1 列和第 5 列中的值,我想将第 7 列中的值替换为“1”。
例如:
- 如果第 1 列=“change”且第 5 列=“defer”,则将第 7 列中的值替换为“1”。
- 如果第 1 列=“change”且第 5 列=“defererence”,则将第 7 列中的值替换为“1”。
- 否则不要对 row 执行任何操作,保持原样。
输入文件:
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 的值,无论字段如何。但我只想通过在循环中将不同的值传递给第一列和第四列来替换基于第一列和第四列的第六列值。
添加更多信息:
正如我上面提到的,上面的例子只是我的问题的最简单形式,以使每个人都能理解需求。我有一个名为“listfile”的文件,其中包含用于匹配的第 1 列和第 5 列的值列表。如果源文件中第 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”。
谢谢
最佳答案
您可以使用 awk
来执行此操作。
awk -F'|' 'BEGIN{OFS="|"}{if($1=="Change"&&$5=="defer"){$7=1}{print}}' file
我意识到您还需要第五列来匹配“差异”...以下应该有效:
awk -F'|' 'BEGIN{OFS="|"}{if($1=="Change"&&$5=="defer"||$5=="defererence"){$7=1}{print}}' file
关于perl - 需要根据文件其他列中的值替换文件的特定列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18990271/