Предположим, что вы:
Тогда это должно выполнить разыскиваемое преобразование.
$ ls
2007-07-22-2300-11S.NAN___024_ABI___HH_E_SAC
$ for i in *; do
od="$(expr $(date +%j -d "${i:0:10}") + 1 )";
chn="${i:39:1}";
sta="$(echo ${i:30:6} | tr -d '_')";
mv "$i" "${i:0:4}.$od.${i:11:2}.${i:13:2}.$sta.${chn,,}" ;
done
$ ls
2007.204.23.00.ABI.e
Следующий perl
сценарий открывает каждый файл, указанный в командной строке, сохраняя дескриптор каждого файла в массиве. Затем он повторно считывает и печатает до 4 строк за раз из каждого файла (, каждый раз проверяя EOF, уменьшая значение счетчика $numopen
каждый раз, когда он достигает EOF файла ), пока не останется файлов с непрочитанные строки.
Не нужно закрывать дескрипторы файлов, потому что perl
автоматически закрывает все открытые файлы при выходе.
#!/usr/bin/perl
use strict;
my @filehandles=();
my $files=0;
# open each input file
foreach my $filename (@ARGV) {
open($filehandles[$files++], "<", $filename) ||
die "Couldn't open '$filename': $!";
}
$files--;
my $numopen = $files;
# print up to 4 lines at a time from each file
while ($numopen > 0) {
for my $i (0..$files) {
if (!eof($filehandles[$i])) {
for (1..4) {
if (!eof($filehandles[$i])) {
print scalar readline($filehandles[$i]);
} else {
$numopen--;
}
}
}
}
}
Сохраните этот скрипт как, например, interleave4.pl
сделайте его исполняемым с помощью chmod +x interleave4.pl
и запустите как./interleave4.pl File[1-7]
Этот сценарий был протестирован путем создания 7 файлов со следующей строкой bash one -.
for i in {1..7}; do printf "File$i %s\n" {1..10} > "File$i"; done
Некоторые из файлов были затем отредактированы, чтобы они не содержали одинаковое количество (10 )строк, чтобы убедиться, что сценарий корректно справится с этой ситуацией (да -он просто переходит к следующему файлу без жалоб ). Точно так же у него нет проблем с входными файлами, число строк которых не делится без остатка на 4.
Обратите внимание, :этот скрипт можно было легко модифицировать так, чтобы число строк, печатаемых при каждом проходе через основной цикл, не было -жестко закодированным числом 4, а бралось как опция в командной строке.