2016-07-19 6 views
1

Я хочу напечатать определенные строки из нескольких текстовых файлов в папке в зависимости от имени файла. Рассмотрим следующие текстовые файлы, названные из 3 слов, разделенных символом подчеркивания:Извлечь определенные строки из нескольких текстовых файлов

Small_Apple_Red.txt 
Small_Orange_Yellow.txt 
Large_Apple_Green.txt 
Large_Orange_Green.txt 

Как можно добиться следующего?

if (first word of file name is "Small") { 
    // Print row 3 column 2 of the file (space delimited); 
} 

if (second word of file name is "Orange") { 
    // print row 1 column 4 of the file; 
} 

Возможно ли это с awk?

ответ

0

Попробуйте следовать ниже.

Используйте glob для обработки файлов в папке.

Затем используйте регулярное выражение для проверки имени файла. Здесь grep использует для извлечения конкретного содержимого из файла.

my $path = "folderpath"; 
while (my $file = glob("$path/*")) 
{ 
    if($file =~/\/Small_Apple/) 
    { 
     open my $fh, "<", "$file"; 
     print grep{/content what you want/ } <$fh>; 
    } 

} 
+0

Это для perl? – amatek

+0

@amatek Да. Это для perl – mkHun

0
use strict; 
use warnings; 

my @file_names = ("Small_Apple_Red.txt", 
        "Small_Orange_Yellow.txt", 
        "Large_Apple_Green.txt", 
        "Large_Orange_Green.txt"); 

foreach my $file (@file_names) { 
    if ($file =~ /^Small/){ // "^" marks the begining of the string 
     print "\n $file has the first word small"; 
    } 
    elsif ($file =~ /.*?_Orange/){ // .*? is non-greedy, this means that it matches anything<br> 
            // until the first "_" is found 
     print "\n $file has the second word orange"; 
    } 
} 

Существует еще особый случай, это файл имеет «Small_Orange» Вы должны решить, что является более важным. Если второе слово является более важным, то переключите содержимое из if секции с содержанием от elsif секции

0

В Awk:

awk 'FILENAME ~ /^Large/ {print $1,$4} 
    FILENAME ~ /^Small/ {print $3,$2}' * 

в Perl:

perl -naE 'say "$F[0] $F[3]" if $ARGV =~ /^Large/; 
      say "$F[2] $F[1]" if $ARGV =~ /^Small/ ' * 
0

Попробуйте это:

use strict; 
use warnings; 
use Cwd; 
use File::Basename; 

my $dir = getcwd(); #or shift the input values from the user 
my @txtfiles = glob("$dir/*.txt"); 

foreach my $each_txt_file (@txtfiles) 
{ 
    open(DATA, $each_txt_file) || die "reason: $!"; 
    my @allLines = <DATA>; 
    (my $removeExt = $each_txt_file)=~s/\.txt$//g; 
    my($word1, $word2, $word3) = split/\_/, basename $removeExt; #Select the file name with matching case 
    if($word1=~m/small/i) #Select your match case 
    { 
     my @split_space = ""; 
     my @allrows = split /\n/, $allLines[1]; #Mentioned the row number 
     my @allcolns = split /\s/, $allrows[0]; 
     print "\n", $allcolns[1]; #Mentioned the column number 
    } 
} 
Смежные вопросы