我有这个文件。正如您在第 1 列中看到的,条目 TEST01N03、TEST01N06 和 TEST01N18 缺失(总共 18 个条目)。有没有办法检查此列的字段并填写缺失的条目?
TEST01N01 40 2002 2697 2523
TEST01N02 40 4 4 5
TEST01N04 40 4 4 5
TEST01N05 40 4 4 5
TEST01N07 40 4 4 5
TEST01N08 40 1 4 5
TEST01N09 40 4 4 5
TEST01N10 40 4 4 5
TEST01N11 40 2002 2621 2617
TEST01N13 40 1 4 5
TEST01N14 40 1 4 5
TEST01N15 40 1 4 5
TEST01N16 40 1 4 5
TEST01N17 40 2002 2576 2515
输出应如下所示:
TEST01N01 40 2002 2697 2523
TEST01N02 40 4 4 5
TEST01N03 empty
TEST01N04 40 4 4 5
TEST01N05 40 4 4 5
TEST01N06 empty
TEST01N07 40 4 4 5
TEST01N08 40 1 4 5
TEST01N09 40 4 4 5
TEST01N10 40 4 4 5
TEST01N11 40 2002 2621 2617
TEST01N12 empty
TEST01N13 40 1 4 5
TEST01N14 40 1 4 5
TEST01N15 40 1 4 5
TEST01N16 40 1 4 5
TEST01N17 40 2002 2576 2515
TEST01N18 empty
非常感谢任何关于完成此任务的脚本建议。
答案1
这是一个perl
解决方案:
$ perl -anle 'BEGIN {$pattern = "TEST01N"}
$curr = $F[0] =~ s/$pattern//r;
if ($prev and ++$prev != $curr) {
printf "%s%02d empty\n", $pattern, $prev;
redo;
}
$prev = $curr;
print;
' file
TEST01N01 40 2002 2697 2523
TEST01N02 40 4 4 5
TEST01N03 empty
TEST01N04 40 4 4 5
TEST01N05 40 4 4 5
TEST01N06 empty
TEST01N07 40 4 4 5
TEST01N08 40 1 4 5
TEST01N09 40 4 4 5
TEST01N10 40 4 4 5
TEST01N11 40 2002 2621 2617
TEST01N12 empty
TEST01N13 40 1 4 5
TEST01N14 40 1 4 5
TEST01N15 40 1 4 5
TEST01N16 40 1 4 5
TEST01N17 40 2002 2576 2515
解释
- 我们获取当前列索引,保存在变量中
$curr
- 如果
$prev
设置并且其值加 1 不等于$curr
,这意味着我们缺少条目,则打印它并从头开始重做直到$prev
等于$curr
。 - 赋值
$curr
给$prev
. - 打印该行。
更新
对于@Babyy的评论,您可以尝试:
$ perl -anle 'BEGIN {$pattern = "TEST01N"}
$curr = $F[0] =~ s/$pattern//r;
if ($. == 1 and (0+$curr) != ++$i) {
printf "%s%02d empty\n", $pattern, $i;
redo;
}
if ($prev and ++$prev != $curr) {
printf "%s%02d empty\n", $pattern, $prev;
redo;
}
$prev = $curr;
print;
' file
答案2
在 awk 中:解析每个输入行以查找前缀current
后的索引TEST01N
。如果当前输出行号 ( n
) 小于索引,则在复制输入行之前打印缺失的行。最后添加更多行以达到所需的数量。
{
i = match($1,/[0-9]+$/);
prefix = substr($1,1,i-1);
current = substr($1,i) + 0;
while (++n < current) printf "%s%02d empty\n", prefix, n;
print;
}
END {
while (++n <= 18) printf "%s%02d empty\n", prefix, n;
}