내 입력 파일은 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
$ 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;
}
편집: 귀하의 질문에는 "파일의 첫 번째 줄"도 나와 있지만 게시한 데이터는 파일에 여러 테스트가 포함되어 있음을 암시하는 것 같으므로 이 코드에서는 이를 고려합니다.