Этот код 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"
Предположим, что ваш первый большой файл имеет имя 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
.
Дан файл 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
Я попробовал использовать следующие методы, и они тоже сработали
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"