Как заменить середину строки в файле на языке Perl

Например, входной файл

ID Name Dept_id
1 aaa 1
2 ddd 1
3 sss 2

Это разделенный табуляцией файл

Это будет вывод

ID Name Dept_id
1 aaa 1.1
2 ddd 2.1
3 sss 3.2

Кто-нибудь может мне помочь??

2 ответа

perl -pe's/^(\d+)\s\S+\s\K(\d+)/$1.$2/' input.txt > output.txt

В Perl-коде программа будет выглядеть так:

while (<>) {
    s/^(\d+)\s\S+\s\K(\d+)/$1.$2/;
} continue {
    print;
}

Регулярное выражение подстановки ищет строку, начинающуюся с одного или нескольких чисел \d+и запишите их в круглых скобках с последующим пробелом \s, не пропуски \S+снова пробельные символы, за которыми следуют числа, которые мы также фиксируем. \K (сохранить) означает, что мы не хотим ничего менять влево. Затем мы заменяем его первой захваченной строкой, точкой . и вторая захваченная строка.

Вы хотите добавить ID номер в dept_id, Поэтому повторяем цикл while для файла.

Затем удалите строки, используя chomp,

затем split каждая строка в массиве разделяется пробелом или табуляцией, затем печатает массив, используя индекс массива.

Ваш $ar[0] держит идентификатор. так что печатать с $ar[0].$ar[2]

open my $handler, "<","file.txt";
my $first = <$handler>;
print "$first";
while (<$handler>)
{
    chomp;
    my @ar = split(/\s+/);
    print "$ar[0]\t$ar[1]\t$ar[0].$ar[2]\n";

}

Или просто попробуйте этот лайнер

-n цикл по входному файлу. затем $. говорит текущий номер строки.

Тогда здесь я использовал сопоставление с образцом для вашего случая.

Я создал временный список с именем $on $tw $th, $on держит идентификатор, $tw держит имя, $th содержит Dept_id. Тогда это даст печать "$on\t$tw\t$on.$th"

perl -ne 'if($. == 1){ print "$_"; next;} ($on,$tw,$th)= $_ =~m/(\w+)/g; print "$on\t$tw\t$on.$th\n";' file.txt 
Другие вопросы по тегам