이 파일이 있습니다. 열 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
current
awk에서: 각 입력 행을 구문 분석하여 접두사 뒤의 색인을 찾습니다 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;
}