提取包含模式文件的行并将它们保存在不同的文件中 grep、sed、awk、print

提取包含模式文件的行并将它们保存在不同的文件中 grep、sed、awk、print

我有这个文件

-   .   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

相关内容