두 필드 사이에 누락된 항목에 대한 새 행을 추가하는 방법

두 필드 사이에 누락된 항목에 대한 새 행을 추가하는 방법

이 파일이 있습니다. 열 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

currentawk에서: 각 입력 행을 구문 분석하여 접두사 뒤의 색인을 찾습니다 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;
 }

관련 정보