Разделение файла с помощью perl

для, например: N = $ (echo $ ((((случайные% 6) +1)) . Я должен получить эту переменную в / etc / etc / et passwd .

Итак, вы пытаетесь распечатать все линии / etc / passwd , которые содержат случайное число от одного до шести?

не будет ли это просто (если предполагает Bash или ZSH [115299] ZSH или ksh для $ случайных , которые базовый posx Shell не Поддержка):

grep $((RANDOM%6+1)) /etc/passwd

Если вам нужно это случайное число в другом месте:

n=$((RANDOM%6+1))
grep $n /etc/passwd

Я не думаю, что это то, что вы пытаетесь сделать, но вы упростили свой вопрос и потеряли этот намек.

0
25.11.2018, 16:59
1 ответ

Один из способов решения этой проблемы:

  • Открыть входной файл
  • Сохранить первую строку входного файла (заголовок)
  • Для каждой строки во входном файле после заголовка:

    • Прочтите первые два столбца
    • Если мы еще не открыли выходной файл для полей, которые вы хотите сопоставить, откройте новый выходной файл и сохраните его дескриптор файла в хэше. Также напишите строку заголовка в новый выходной файл.
    • Получить дескриптор выходного файла, в котором мы должны сохранить эту строку, из хэша дескриптора файла. Напишите строку в этот файл.

Вот пример кода, который будет соответствовать первым двум полям:

#!/usr/bin/perl

use strict;
use warnings;

my %filehandles=();
my $filenum=1;

open INPUT, "fruit.csv" 
    or die "Cannot open input file.";

my $header = <INPUT>;

while ( <INPUT> )
{   # Remove spaces from input 
    $_ =~ s/ //g;

    my @fields = split ',', $_;

    if ( ! $filehandles{$fields[0]}{$fields[1]} )
    {   open $filehandles{$fields[0]}{$fields[1]} , ">file$filenum"
            or die "Cannot open output file file$filenum.";
        print {$filehandles{$fields[0]}{$fields[1]}} $header;
        $filenum++;
    }
    print {$filehandles{$fields[0]}{$fields[1]}} $_;
}
0
28.01.2020, 04:56

Теги

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