我在这里发现了关于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次?
答案 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