我在这里发现了关于 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/