извлечь строки, содержащие файл шаблонов, и сохранить их в разных файлах grep, sed, awk, print

Этот код Perl дает почти в точности ожидаемый результат:

use Text::CSV;

my $csv = Text::CSV->new({ binary => 1, eol => $/, allow_loose_quotes => 1, escape_char => undef });

open my $io, "<", $ARGV[0] or die;

while (my $row = $csv->getline ($io)) {
        my @o = map { $_ =~ s,^\s*,,; $_ =~ s,\s*$,,; $_; } @{$row};
        $csv->print(STDOUT, \@o);
}

вывод

1,"/var/adm/sys ldd/all  /Comm/logs",34356,234245,24245
2,"/var/adm/sys ldd/all
/Comm/debugs.txt",45356,435,"578 58976"
3,"add this line in crontab    :",34356,234245,24245
4,"1.0348    54 35.5",45356,435,578
4,"1 2","45356 95857",435,578
5,"1 2","45356 95857",""435","578""
6,"1.0348    54 35.5",45356,""4"""    ""35",578
7,"1.0348    54 35.5",""45356",""4"""""35,"578"
0
26.04.2019, 04:13
3 ответа

Предположим, что ваш первый большой файл имеет имя 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. Это будет перебирать каждую строку усеченного source.txt, выполняя <FOO>для каждой строки.
  • grep "$line" target.txt > "$line":для каждой строки source.txt, выполните grep для нее в target.txt, затем запишите в файл с тем же именем, что и исходная строка, которую вы искали.

Небольшой комментарий. :Если source.txtна самом деле содержит фиксированные строки вместо шаблонов, вы можете использовать опцию -Fдля grep.

1
28.01.2020, 03:47

Дан файл 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
1
28.01.2020, 03:47

Я попробовал использовать следующие методы, и они тоже сработали

for i in `cat patternfile`; do sed -n '/'$i'/p' examplefile >file_$i.txt ; done


examplefile===> datafile
patternfile===> Consists of data which contains pattern which need to be searched in examplefile

after each pattern search output will be saved in "file_pattern.txt"
0
28.01.2020, 03:47

Теги

Похожие вопросы