ファイルの最初の行番号を取得する方法

ファイルの最初の行番号を取得する方法

私の入力ファイルは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

おすすめ記事