如何获取文件第一行的数字

如何获取文件第一行的数字

我的输入文件是 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;
}

编辑:您的问题还说“文件的第一行”,但是您发布的数据似乎暗示文件包含多个测试,因此此代码考虑了这一点。

相关内容