1

シェル スクリプトで grep コマンドを使用しているときに問題に直面しています。実際には、以下のレコードを含む 1 つのファイル (PCF_STARHUB_20130625_1) があります。

SH_5.55916.00.00.100029_20130601_0001_NUC.csv.gz|438|3556691115
SH_5.55916.00.00.100029_20130601_0001_Summary.csv.gz|275|3919504621
SH_5.55916.00.00.100029_20130601_0001_UI.csv.gz|226|593316831
SH_5.55916.00.00.100029_20130601_0001_US.csv.gz|349|1700116234
SH_5.55916.00.00.100038_20130601_0001_NUC.csv.gz|368|3553014997
SH_5.55916.00.00.100038_20130601_0001_Summary.csv.gz|276|2625719449
SH_5.55916.00.00.100038_20130601_0001_UI.csv.gz|226|3825232121
SH_5.55916.00.00.100038_20130601_0001_US.csv.gz|199|2099616349
SH_5.75470.00.00.100015_20130601_0001_NUC.csv.gz|425|1627227450

そして、1 つの変数 (INPUT_FILE_T) に格納されているパターンがあり、ファイル (PCF_STARHUB_20130625_1) からパターンを検索したいと考えています。そのために、以下のコマンドを使用しました

INPUT_FILE_T="SH?*???????????????US.*"
grep ${INPUT_FILE_T} PCF_STARHUB_20130625_1 

上記のコマンドの出力は次のようになります

PCF_STARHUB_20130625_1:SH_5.55916.00.00.100029_20130601_0001_US.csv.gz|349|1700116234

出力に 2 つの問題があります。1 つ目は、出力に 1 つのエントリしか表示されないこと (2 つのエントリが含まれている必要があります) であり、2 つ目の問題は、出力に「PCF_STARHUB_20130625_1:」が含まれていることです。出力は以下のようになります

SH_5.55916.00.00.100029_20130601_0001_US.csv.gz|349|1700116234
SH_5.55916.00.00.100038_20130601_0001_US.csv.gz|199|2099616349

grep以外のテクニックはありますか教えてください。

この問題について私を助けてください。

4

2 に答える 2

0

my にデータをコピーした後input.txt

$> (export INPUT_FILE_T="SH.*US\.*"; grep -h ${INPUT_FILE_T} input.txt)
SH_5.55916.00.00.100029_20130601_0001_US.csv.gz|349|1700116234
SH_5.55916.00.00.100038_20130601_0001_US.csv.gz|199|2099616349

編集

絶対に glob パターンを使用する必要がある場合は、これを行うユーティリティが存在する可能性がありますが、私は知りません。次の簡単な C プログラムが役に立ちます。

#include <fnmatch.h>
#include <stdio.h>
#include <stdlib.h>

#define MAX_LINE_LENGTH 4096

int main(int argc, char**argv)
{
    if (argc < 2) { return EXIT_FAILURE; }

    FILE *in = stdin;
    const char *pattern = argv[1];

    char line[MAX_LINE_LENGTH + 1];
    while (fgets(line, MAX_LINE_LENGTH, in))
    {
        if (!fnmatch(pattern, line, 0))
        {
            printf("%s", line);
        }
    }
    return EXIT_SUCCESS;
}

コンパイルするには (上記のプログラムはファイルにありますmyfnmatch.c):

$> gcc -Wall myfnmatch.c -o myfnmatch

stdin使用例 (へのリダイレクトに注意してくださいinput.txt):

(export INPUT_FILE_T="SH?*???????????????US.*"; ./myfnmatch ${INPUT_FILE_T} <./input.txt)
SH_5.55916.00.00.100029_20130601_0001_US.csv.gz|349|1700116234
SH_5.55916.00.00.100038_20130601_0001_US.csv.gz|199|2099616349
于 2013-06-25T08:07:46.430 に答える