1

在 shell 脚本中使用 grep 命令时遇到问题。实际上我有一个文件(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

我有一个存储在一个变量(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

我在输出中有两个问题,首先是输出中只显示一个条目(它应该包含两个条目),第二个问题是,输出包含不应该出现的“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

您可以使用.*任意次数匹配任何字符,因此可以简化您的搜索模式(也不需要最后一个通配符):

INPUT_FILE_T="SH.*US\."

要从输出中删除文件名,请使用-hgrep 标志:

$ grep -h ${INPUT_FILE_T} 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
于 2013-06-25T08:17:26.230 回答
0

将您的数据复制到我的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

示例用法(注意stdinto的重定向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 回答