Переформатирование текстовых файлов с помощью Perl

Вот как они появляются на Solaris w/ZFS, Linux w/ NFSv4, и Linux w/ NFSv3:

Solaris 11.3 ZFS Filesystem:

bash-[509]$ ls -Vd /ssd/TIVO
drwxrwxr-x+ 12 tim      users         15 Feb 23 17:34 /ssd/TIVO/
               user:tim:rwxpdDaARWcCos:fd-----:allow
                 owner@:rwxp-DaARWcCos:-------:allow
                 group@:rwxp-DaARWc--s:-------:allow
              everyone@:r-x---a-R-c--s:-------:allow

Linux клиент с NFS v4 mount of Solaris 11. 3 ZFS/NFS файловая система:

bash:~$ lsb_release -d
Description:    Ubuntu 16.04 LTS

bash:~$ mount | grep TIVO
tank:/ssd/TIVO on /ssd/TIVO type nfs4 (rw,relatime,vers=4.0,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.0.100,local_lock=none,addr=192.168.2.1)

bash:~$ nfs4_getfacl /ssd/TIVO
A:fd:tim@tank:rwaDdxtTnNcCoy
A::OWNER@:rwaDxtTnNcCoy
A:g:GROUP@:rwaDxtTnNcy
A::EVERYONE@:rxtncy

Linux клиент с NFS v3 монтирует Solaris 11.3 ZFS/NFS файловую систему:

bash:/ssd# lsb_release -d
Description:    Ubuntu 16.04.2 LTS

bash:/ssd# mount | grep TIVO
tank:/ssd/TIVO on /ssd/TIVO type nfs (rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=192.168.2.1,mountvers=3,mountport=59133,mountproto=tcp,local_lock=none,addr=192.168.2.1)

bash:/ssd# getfacl /ssd/TIVO
getfacl: Removing leading '/' from absolute path names
# file: ssd/TIVO
# owner: tim
# group: users
user::rwx
group::rwx
other::r-x
1
30.04.2017, 20:02
2 ответа
perl -alF\\n -00ne '
   push @{ $A[$_] }, $F[$_] for 0 .. $#F; END{
   print join "\t", @$_ for @A;}
' yourfile.txt

  • Опции Perl

    -a Для каждой прочитанной записи она будет автоматически разделять запись по разделителю полей, указанному в опции -F и сохраните поля в массиве @F.

    -l Наборы ORS = RS = "\n"

    -F\\n Наборы FS = "\n"

    -00 Наборы RS = "\0" означает, включить режим абзаца. Обратите внимание, что он отменяет RS из предыдущей настройки с помощью -l.

    -n Устанавливает неявное чтение файла в цикле + не печатать, если об этом не попросят.

    -e Применить данный код Perl к каждой записи из входного файла.

  • Рабочий

    @A представляет собой список-списков, также известный как LoL, в котором мы храним соответствующие строки из каждой записи. Итак, первые строки каждой записи хранятся в $A[0], вторые строки из каждой записи помещаются в $A[1], ...

    Затем, когда исчерпано чтение всех записей из файла, мы просто распечатайте массив, элементами которого являются LoL , соответствующим образом соединенные TAB.

Результаты

HEADER1  HEADER2  HEADER3  HEADER4
item1    item1    item1    item1
item2    item2    item2    item2
1
27.01.2020, 23:45

Я не уверен, что то, что вы хотите, это то, чего вы действительно хотите. Я отмечаю, что каждый блок имеет Дата в качестве первого столбца и что в вашем примере значения в этом столбце одинаковы во всех блоках. Если то, что вы действительно хотите в выводе, это каждая дата, за которой следуют все строки, не относящиеся к дате, для этой даты в каждом блоке:

 Date Years … FWIP
01 января 2017 0 217100,9
 

Затем просто используйте Perl, чтобы разбить ваши данные на отдельные файлы (новый файл каждый раз, когда вы видите строки, не соответствующие \d+\-…\-\d\d\d\d шаблон регулярного выражения форматов даты VMS) и используйте команду оболочки join, чтобы сделать все остальное в соответствии с этим сообщением именно об этой проблеме

Не пишите код, когда уже есть инструмент для решить свою специализированную, но очень распространенную проблему!

0
27.01.2020, 23:45

Теги

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