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

标签 ubuntu grep

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

我有一个 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

输出文件的名称与搜索的字符串 bring 相同 - 前面没有数字 1。

有没有什么办法可以对多个字符串grep一次,然后将每个字符串的结果输出到不同的文件,这样我就不必运行grep 1200次了?

最佳答案

同意评论者的观点,这似乎无法通过 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

关于ubuntu - Grep多个字符串并输出到多个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53803904/

相关文章:

python - 使用 pip 安装模块,未找到

php - 为什么我的浏览器不加载我的项目 laravel?

mysql - 在 ubuntu 中重新安装 mysql-client 在 openSIPS menuconfig 工具中出现错误

linux - 带星号的 grep

linux - 在不使用双引号的情况下搜索包含当前日期的日志文件

linux - 将 grep 传递给 bash 中的变量

php - 权威的 LEMP 堆栈官方 - Ubuntu 14.04

regex - 如何使用正则表达式负前瞻

bash - 在大型数据集上使用 grep 或 fgrep 循环非常慢

java - 我们如何在ubuntu os中通过j2me代码打开浏览器?