我有这个文件
- . ID = tom_fa_10005086
- 0 Parent = tom_fa_10005086
- 0 Parent = tom_fa_10005086
- 2 Parent = tom_fa_10005086
- 1 Parent = tom_fa_10005086
- 0 Parent = tom_fa_10005086
- 0 Parent = tom_fa_10005086
+ . ID = tom_fa_10013928
+ 0 Parent = tom_fa_10013928
+ 0 Parent = tom_fa_10013928
+ 0 Parent = tom_fa_10013928
+ 0 Parent = tom_fa_10013928
+ 2 Parent = tom_fa_10013928
+ 2 Parent = tom_fa_10013928
+ 1 Parent = tom_fa_10013928
+ 1 Parent = tom_fa_10013928
+ 2 Parent = tom_fa_10013928
+ 2 Parent = tom_fa_10013928
- . ID = tom_fa_10000024
- 0 Parent = tom_fa_10000024
- . ID = tom_fa_10004587
- 0 Parent = tom_fa_10004587
- 1 Parent = tom_fa_10004587
和这些图案
COL 1
tom_fa_10005086
tom_fa_10013928
tom_fa_10000024
tom_fa_10011338
tom_fa_10003474
我想在模式与行匹配时提取行并将其保存在文件中。
但是我有 150 种模式,我需要将每种匹配都保存在不同的文件中?所以我有 150 种模式,我就会有 150 个输出文件。
结果如下:
文件1
- . ID = tom_fa_10005086
- 0 Parent = tom_fa_10005086
- 0 Parent = tom_fa_10005086
- 2 Parent = tom_fa_10005086
- 1 Parent = tom_fa_10005086
- 0 Parent = tom_fa_10005086
- 0 Parent = tom_fa_10005086
文件2
+ . ID = tom_fa_10013928
+ 0 Parent = tom_fa_10013928
+ 0 Parent = tom_fa_10013928
+ 0 Parent = tom_fa_10013928
+ 0 Parent = tom_fa_10013928
+ 2 Parent = tom_fa_10013928
+ 2 Parent = tom_fa_10013928
+ 1 Parent = tom_fa_10013928
+ 1 Parent = tom_fa_10013928
+ 2 Parent = tom_fa_10013928
+ 2 Parent = tom_fa_10013928
文件3……
我在想:
grep -f 文件 1 文件 1 | ....
grep -E
答案1
给定一个patterns
文件:
$ cat patterns
tom_fa_10005086
tom_fa_10013928
tom_fa_10000024
tom_fa_10011338
tom_fa_10003474
然后
awk 'NR==FNR{a[$1]=NR; next} $NF in a {print > "outfile" a[$NF]}' patterns file
结果如下文件:
$ head outfile?
==> outfile1 <==
- . ID = tom_fa_10005086
- 0 Parent = tom_fa_10005086
- 0 Parent = tom_fa_10005086
- 2 Parent = tom_fa_10005086
- 1 Parent = tom_fa_10005086
- 0 Parent = tom_fa_10005086
- 0 Parent = tom_fa_10005086
==> outfile2 <==
+ . ID = tom_fa_10013928
+ 0 Parent = tom_fa_10013928
+ 0 Parent = tom_fa_10013928
+ 0 Parent = tom_fa_10013928
+ 0 Parent = tom_fa_10013928
+ 2 Parent = tom_fa_10013928
+ 2 Parent = tom_fa_10013928
+ 1 Parent = tom_fa_10013928
+ 1 Parent = tom_fa_10013928
+ 2 Parent = tom_fa_10013928
==> outfile3 <==
- . ID = tom_fa_10000024
- 0 Parent = tom_fa_10000024
答案2
假设您的第一个大文件被命名为target.txt
,第二个较小的文件被命名为source.txt
.
tail +3 source.txt | while IFS= read -r line; do grep "$line" target.txt > "$line"; done
解释
tail +3 source.txt
: 删除前两行source.txt
| while IFS= read -r line; do <FOO>; done
:将此截断的文件通过管道传输到while read
构造中。这将迭代 truncated 的每一行source.txt
,<FOO>
对每一行执行操作。grep "$line" target.txt > "$line"
:对于每一source.txt
行,在 中查找它target.txt
,然后写入与您搜索的原始字符串同名的文件。
一个小评论:如果source.txt
实际上包含固定字符串而不是模式,则可以使用-F
的选项grep
。