Как заменить середину строки в файле на языке 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