使用 AWK 搜索行并替换为另一行中的特定值

使用 AWK 搜索行并替换为另一行中的特定值

我想用第二行中给出的值替换第一行中的“1”。这是输入数据集:

0,0,1,1,0,0,1,1,0,1,0,1,0,1
65,70,75,80,85,85,90

期望的输出:

0,0,65,70,0,0,75,80,0,85,0,85,0,90

提前致谢。

答案1

像这样(任何awk):

$ tac file | awk '
    BEGIN{FS=OFS=","}
    NR==1{split($0, a, FS);next}
    NR==2{for (i=1; i<=NF; i++)
        if ($i == 1) $i=a[++c]}
    1 # aka print
' 

替换tac filetail -r fileon*BSD

输出

0,0,65,70,0,0,75,80,0,85,0,85,0,90

答案2

使用GNUsed

$ sed -Ez ':a;s/([^,]*)1\>(,?[^\n]*\n)([0-9]+)(,|\n)/\1\3\2/;ta' input_file
0,0,65,70,0,0,75,80,0,85,0,85,0,90

答案3

我喜欢 @GillesQuenot 的答案,但这里有一个使用 perl 的替代方案,不需要tacor tail -r

相反,它使用三个数组 - 一个用于第一个输入行 ( @l),一个用于第二行 ( @a),第三个用于输出 ( ) @o)。它在 END 块中进行打印:

$ perl -F, -le '
    if ($.==1) { @l = @F };
    if ($.==2) { @a = @F };
    END {
      foreach $i (0..$#l) {
        push @o, $l[$i] == 1 ? $a[$c++] : $l[$i]
      };
      print join("," , @o)
    }' input.txt
0,0,65,70,0,0,75,80,0,85,0,85,0,90

顺便说一句,perl 的-F选项自动启用 perl 的-a(自动拆分为名为 @F 的数组)和-n(迭代输入,如sed -nawk)选项。-l启用自动处理行结束字符(例如换行符)。

您可以使用 awk 执行类似的操作,但您可能必须编写一个join()函数(内置于 perl 中)。

相关内容