perl -aF'\t' -lpe '$_.= "\t". ($. == 1 ? @F+1 : grep $_, @F[6..$#F])' data.set
Поскольку нам нужно добавить еще одно поле в конец строки, мы используем оператор .=
для текущей записи $_
. Для частного случая 1-й записи мы просто добавляем выражение @F+1
, которое интерпретируется в скалярном контексте как означающее текущее количество полей плюс 1.
Для записей заголовка, отличных от -, выражение grep $_, @F[6..$#F]
означает итерацию по 7-му элементу до последнего элемента @F
массива (, который вырезается из записи с помощью разделителя полей табуляции, указанного через вариант -F'\t'
. В скалярном контексте он возвращает количество раз, когда условие, в нашем случае, одиночное $_
, означает ненулевые элементы в срезе 7-й... до последнего элемента.
#1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
1 10024 10395 41 K + 2 1 1 12 14 5 0 0 3 1 3 6 2 11
1 10679 10795 51 P + 2 1 1 15 14 3 0 0 2 1 2 3 1 11
С этими абсолютными путями к устройствам все в порядке, так как их имена стабильны и предписываются первыми полями в строках /etc/crypttab
. На самом деле, они являются символическими ссылками на пронумерованные (, поэтому нестабильные )имена узлов устройства сопоставления устройств. Если /etc/crypttab
ссылается на их исходные устройства (во вторых полях )по стабильным именам или UUID, вы защищены от непредсказуемого порядка устройств.