Nano Hash - криптовалюты, майнинг, программирование

Обновите значение первого столбца файла и продолжайте добавлять n раз

Я ищу лучший способ добавить 2 к содержимому в первом столбце файла и продолжать добавлять n раз. Это может быть однострочная программа.

Входной файл (sparc_test.export, в реальном файле более 3000 строк):

20000 cmp_top.iop.sparc0.exu.alu.byp_alu_rcc_data_e[6]
20000 cmp_top.iop.sparc0.exu.alu.byp_alu_rs3_data_e[51]
20000 cmp_top.iop.sparc0.exu.alu.byp_alu_rs1_data_e[3]
20000 cmp_top.iop.sparc0.exu.alu.shft_alu_shift_out_e[18]
20000 cmp_top.iop.sparc0.exu.alu.byp_alu_rs3_data_e[17]
20000 cmp_top.iop.sparc0.exu.alu.byp_alu_rs1_data_e[43]

Ожидаемый выходной файл (допустим, он запускается 3 раза):

20000 cmp_top.iop.sparc0.exu.alu.byp_alu_rcc_data_e[6]
20000 cmp_top.iop.sparc0.exu.alu.byp_alu_rs3_data_e[51]
20000 cmp_top.iop.sparc0.exu.alu.byp_alu_rs1_data_e[3]
20000 cmp_top.iop.sparc0.exu.alu.shft_alu_shift_out_e[18]
20000 cmp_top.iop.sparc0.exu.alu.byp_alu_rs3_data_e[17]
20000 cmp_top.iop.sparc0.exu.alu.byp_alu_rs1_data_e[43]
20002 cmp_top.iop.sparc0.exu.alu.byp_alu_rcc_data_e[6]
20002 cmp_top.iop.sparc0.exu.alu.byp_alu_rs3_data_e[51]
20002 cmp_top.iop.sparc0.exu.alu.byp_alu_rs1_data_e[3]
20002 cmp_top.iop.sparc0.exu.alu.shft_alu_shift_out_e[18]
20002 cmp_top.iop.sparc0.exu.alu.byp_alu_rs3_data_e[17]
20002 cmp_top.iop.sparc0.exu.alu.byp_alu_rs1_data_e[43]
20004 cmp_top.iop.sparc0.exu.alu.byp_alu_rcc_data_e[6]
20004 cmp_top.iop.sparc0.exu.alu.byp_alu_rs3_data_e[51]
20004 cmp_top.iop.sparc0.exu.alu.byp_alu_rs1_data_e[3]
20004 cmp_top.iop.sparc0.exu.alu.shft_alu_shift_out_e[18]
20004 cmp_top.iop.sparc0.exu.alu.byp_alu_rs3_data_e[17]
20004 cmp_top.iop.sparc0.exu.alu.byp_alu_rs1_data_e[43]

Однострочный perl-код для добавления 2 в первый столбец:

perl -pe 's/(\d+)/$1 + 2/e' sparc_export.test

Итак, я использовал этот код и добавил (‹‹) 3 раза, но кажется, что это не нормально, и я думаю, что есть лучший способ с однострочным кодом. Любая помощь приветствуется.

мой код perl (test.pl)

#!/usr/bin/perl 

use strict;
use warnings;
my $fin;
my $foutput;

for (my $i=0; $i < 3; $i++) {
            open $fin, '<', 'sparc_export.test' or die "Can't open file: $!";
            open $fout, '>>', 'sparc_export.test.out' or die "Can't open file: $!";
            while (<$fin>) {
                s/(\d+)/$1 + 2/e;
                print $fout $_;
            }
            close $fout;
            close $fin;
            rename 'sparc_export.test.out', 'sparc_export.test' or die "Failed to rename: $!";
            system $bin, @args;
}
28.03.2017

Ответы:


1

Единственная недостающая часть заключается в том, что вы не копируете входной файл сначала. (Ну и зачем цикл for в стиле C?)

Вы также можете избежать дополнительных операций с файлами — читайте в массив и работайте с ним.

use warnings;
use strict;

my $infile = 'sparc_export.test';
open my $fh, '<', $infile or die "Can't open $infile: $!";
my @lines = <$fh>;

my $outfile = 'sparc_export.test.out';
open    $fh, '>>', $outfile or die "Can't open for append $outfile: $!";

print $fh $_ for @lines;  # copy the original first

for my $i (1..3) 
{
    s/^\s*(\d+)/$1+2/e for @lines;  # changes @lines in place  

    print $fh $_ for @lines;
}
close $fh;
# now overwrite source

Или сделать все это в памяти и один раз обновить оригинал, так как файл такой маленький. Использует Path::Tiny

use warnings;
use strict;
use Path::Tiny;

my @lines = path('sparc_export.test')->lines;

my @all_lines = @lines;   

push @all_lines, map { s/(\d+)/$1+100/e; $_ } @lines  for 1..3;

path('sparc_export.test')->append( {truncate => 1}, @all_lines );

Параметр append с truncate добавляет замену содержимого на место.

Or

my @lines = path('sparc_export.test')->lines;

my @new_lines = map { 
    map { s/(\d+)/$1+100/e; $_ } @lines 
} 1..3;

path('sparc_export.test')->append( @new_lines );

Я не вижу ничего лучше в однострочнике, если только это не является особым требованием.

28.03.2017
  • спасибо за ваш ответ, но я получил синтаксическую ошибку: строка 11, рядом с открытым глобальным символом $outfile требуется явное имя пакета в ./sparc_extract.pl строка 11. Выполнение ./sparc_extract.pl прервано из-за ошибок компиляции. 29.03.2017
  • Я исправил ошибку, добавив ; после «sparc_export.test.out». 29.03.2017
  • @JaeyoungPark Извините за опечатку и спасибо, что заметили ее и сообщили мне :) 29.03.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..