perl - 需要根据文件其他列中的值替换文件的特定列值

标签 perl shell unix nawk

以下是我的文件内容,以下是我的要求 基于第 1 列和第 5 列中的值,我想将第 7 列中的值替换为“1”。

例如:

  1. 如果第 1 列=“change”且第 5 列=“defer”,则将第 7 列中的值替换为“1”。
  2. 如果第 1 列=“change”且第 5 列=“defererence”,则将第 7 列中的值替换为“1”。
  3. 否则不要对 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/

相关文章:

perl - 哪个 Perl ssh 模块支持 kerberos 身份验证?

shell - 如何在ubuntu中逐行流水线

linux - shell脚本中文件的旋转

perl - 格式化日期的简单方法

perl - 为什么从模块调用函数时会收到错误消息 "Undefined subroutine"?

perl - 在 directory.pl 第 2 行的 @INC(@INC 包含 : D:/tools/lib .)中找不到 File/Glob.pm

bash - 如何可变化 maven pom.xml 上的 shell 脚本输出以供使用

unix - 在 Unix shell 脚本中将 ASCII 码转换为十六进制

Node.JS:替代 chown 字符串

bash - 用文件中的多行替换一行