Вот как они появляются на 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
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
Я не уверен, что то, что вы хотите, это то, чего вы действительно хотите. Я отмечаю, что каждый блок имеет Дата в качестве первого столбца и что в вашем примере значения в этом столбце одинаковы во всех блоках. Если то, что вы действительно хотите в выводе, это каждая дата, за которой следуют все строки, не относящиеся к дате, для этой даты в каждом блоке:
Date Years … FWIP 01 января 2017 0 217100,9
Затем просто используйте Perl, чтобы разбить ваши данные на отдельные файлы (новый файл каждый раз, когда вы видите строки, не соответствующие \d+\-…\-\d\d\d\d
шаблон регулярного выражения форматов даты VMS) и используйте команду оболочки join, чтобы сделать все остальное в соответствии с этим сообщением именно об этой проблеме
Не пишите код, когда уже есть инструмент для решить свою специализированную, но очень распространенную проблему!