我想用第二行中给出的值替换第一行中的“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 file
为tail -r file
on*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 的替代方案,不需要tac
or 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 -n
或awk
)选项。-l
启用自动处理行结束字符(例如换行符)。
您可以使用 awk 执行类似的操作,但您可能必须编写一个join()
函数(内置于 perl 中)。