파일의 첫 번째 줄 번호를 얻는 방법

파일의 첫 번째 줄 번호를 얻는 방법

내 입력 파일은 file_1.txt, file_2.txt, file_3.txt 등입니다. 이 파일에는 다음 데이터가 포함되어 있습니다

$ head file_*.txt
==> file_1.txt <==
----- Reset Loop 1 -------

Test #1
data

Test #2
data

Test #3

Test #4
data

==> file_2.txt <==
----- Reset Loop 2 -------

Test #1

Test #2
data

Test #3

Test #4
data


==> file_3.txt <==
----- Reset Loop 3 -------

Test #1
data

Test #2
data

Test #3

Test #4

현재 내가 가지고 있는 코드는 입력 파일의 각 테스트에서 사용 가능한 데이터가 다음과 같은 경우에만 테스트 후에 파일 이름과 시퀀스 번호를 가져옵니다.

#!/bin/bash

awk '
    FNR==1 {
        testId = ""
        split(FILENAME,f,/[_.]/)
        fileId = f[4]
    }
    testId != "" {
        if (NF) {
            print testId > "1_val.txt"
            print fileId > "2_val.txt"
        }
        testId = ""
    }
    sub(/^Test #/,"") {
        testId = $0
    }
' file_*.txt

이 코드에서 얻은 결과는 다음과 같습니다.

1_val.txt

1
2
4
2
4
1
2

2_val.txt

਱਱਱਱਱਱਱਱਱਱ਲਲਲਲਲਲਲਲਲਲਲ਼ਲ਼ਲ਼ਲ਼ਲ਼ਲ਼ਲ਼ਲ਼ਲ਼ਲ਼਴਴਴਴਴਴਴਴਴਴ਵਵਵਵਵਵਵਵਵਵ

출력 파일에 이상한 문자가 있기 때문에 운영 체제나 다른 문제에 문제가 있을 수 있습니다. 또 다른 방법을 생각했는데, 입력 파일의 첫 번째 줄에 나열된 데이터의 번호를 가져오는 것이었습니다.1_val.txt.

이에 대한 내 코드는 다음과 같으나 awk 'NR==1' file_*.txt스크립트에서 이 특정 명령을 어디에 삽입해야 할지 잘 모르겠습니다.

The expected output:

2_val.txt

1
1
1
2
2
3
3

편집: 이것은 출력 파일을 생성하기 위해 실행한 정확한 명령입니다.

thulasyc > cat data_collect.sh
#!/usr/bin/env bash

awk '
    FNR==1 {
        testId = ""
        fileId = $4
    }
    testId != "" {
        if (NF) {
            print testId > "1_val.txt"
            print fileId > "2_val.txt"
        }
        testId = ""
    }
    sub(/^TX PTP Command #/,"") {
        testId = $0
    }
' "${@:--}"
thulasyc > ./data_collect.sh ptp_log_reset_*.txt
thulasyc > head *_val*
==> 1_val.txt <==
1 
2 
3 
5 
6 
11 
12 
13 
15 
16 

==> 2_val.txt <==
1
1
1
1
1
1
1
1
1
1

출력 파일 내용 표시:

1_val.txt 여기에 이미지 설명을 입력하세요.

2_val.txt 여기에 이미지 설명을 입력하세요.

답변1

$ cat tst.sh
#!/usr/bin/env bash

awk '
    FNR==1 {
        testId = ""
        fileId = $4
    }
    testId != "" {
        if (NF) {
            print testId > "1_val.txt"
            print fileId > "2_val.txt"
        }
        testId = ""
    }
    sub(/^Test #/,"") {
        testId = $0
    }
' "${@:--}"

$ ./tst.sh file_*.txt

$ head *_val*
==> 1_val.txt <==
1
2
4
2
4
1
2

==> 2_val.txt <==
1
1
1
2
2
3
3

답변2

꼭 awk를 사용해야 하나요? Perl에서 이를 수행하려면 다음으로 시작할 수 있습니다.

#!/usr/bin/perl

use strict;
use warnings;
use diagnostics;

#put your files here:
my @files = ('file_1.txt','file_2.txt');

foreach my $filename (@files) {
    my $test;
    my $number;
  open(my $fh, "<", $filename)
    or die "Can't open $filename ";
        print "$filename:\n";
        while(my $row = <$fh>) {
            if ($row =~ /^Test #.*/){
                $test = 1;
                $number = $row;
                $number =~ s/\D//g;
            }
            elsif ($test and (length($row) > 1) ) {
                print "$number\n";
                $test = 0;  
            }
        }
        close $fh;
}

편집: 귀하의 질문에는 "파일의 첫 번째 줄"도 나와 있지만 게시한 데이터는 파일에 여러 테스트가 포함되어 있음을 암시하는 것 같으므로 이 코드에서는 이를 고려합니다.

관련 정보