Grep多个字符串并输出到多个文件

时间:2018-12-16 15:58:49

标签: ubuntu grep

我在这里发现了关于greping多个字符串的问题以及关于输出到多个文件的问题,但是我似乎找不到关于同时进行这两个操作的任何问题。

我有一个300GB的文件,需要对大约1200个字符串进行正则表达式grep。我试图对文件进行grep一次,这样它就不必遍历1200次。

以下是我目前正在做1200次的示例:

grep -hi "^1wh" /system/data/DATAFILE.txt > /system/tables/wh.csv
grep -hi "^1wi" /system/data/DATAFILE.txt > /system/tables/wi.csv
grep -hi "^1wj" /system/data/DATAFILE.txt > /system/tables/wj.csv
grep -hi "^1wk" /system/data/DATAFILE.txt > /system/tables/wk.csv
grep -hi "^1al" /system/data/DATAFILE.txt > /system/tables/al.csv
grep -hi "^1am" /system/data/DATAFILE.txt > /system/tables/am.csv
grep -hi "^1an" /system/data/DATAFILE.txt > /system/tables/an.csv

输出文件的名称与搜索到的字符串相同-开头没有数字1。

有没有办法对多个字符串一次grep文件并将每个字符串的结果输出到不同的文件,所以我不必运行grep 1200次?

1 个答案:

答案 0 :(得分:0)

同意评论者的意见,grep似乎无法做到这一点。

以下内容如何处理呢?它遍历正则表达式以生成一个awk程序,该程序将数据文件的每一行附加到其适当的输出文件:

#!/usr/bin/env bash

mkdir -p output
rm -f output/*
rm -f pattern.awk

readarray -t patterns < patterns

echo "BEGIN{IGNORECASE=1}" > pattern.awk

for pattern in "${patterns[@]}"; do
    echo "/$pattern/{print \$0 >> \"output/$pattern\"}" >> pattern.awk
done

awk -f pattern.awk data

结果:

$ cat data
1Abfoo
1whfoo
1wifoo
1wjfoo
43hfoo
1wkfoo
1abfoo


$ cat patterns
^1wh
^1wi
^1wj
^1wk
^1ab

$ ./parse.sh

$ head output/*
==> output/^1ab <==
1Abfoo
1abfoo

==> output/^1wh <==
1whfoo

==> output/^1wi <==
1wifoo

==> output/^1wj <==
1wjfoo

==> output/^1wk <==
1wkfoo