我的输入文件是 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;
}
编辑:您的问题还说“文件的第一行”,但是您发布的数据似乎暗示文件包含多个测试,因此此代码考虑了这一点。