На этом дизайне везде написано состояние гонки. Вы не можете быть уверены, что сигналы будут доставлены по порядку или даже вообще. Если вы используете Perl, это делает его вдвойне неопределенным.
Измените дизайн таким образом, чтобы от родителя к потомку было какое-то подтверждение о получении данных. Порядок и номер доставки сигнала - вещь ненадежная, требовать портативного решения еще более безнадежно.
Вы можете сделать это в awk
. Например:
$ awk -vOFS="\t" '{
sub(/.txt:.*= */," ");
sub(/^.../,"",$1);
sub(/_split/, "\t",$1);
print $1,$2,$3
}' file
0001 00000000 0.0000 mW
0001 00000050 117.5261 uW
Это действительно не лучший инструмент для работы. Awk отлично подходит, когда вы хотите извлекать поля без изменений, он может стать громоздким, когда вам нужно их редактировать.
Вместо этого я бы использовал что-то вроде:
$ perl -lne '
@m=(/\D+(\d+)\D+(\d+).*=\s*([0-9.]+)\s+(\S+).*$/);
print join "\t", @m' file
0001 00000000 0.0000 mW
0001 00000050 117.5261 uW
Как насчет использования sed
вместо awk
?
sed -r 's/^_my([0-9]+)_split([0-9]+)\.txt:[^=]*=\s*([0-9.]+) *(\S+).*/\1\t\2\t\3 \4/' /path/to/file
Если у вас есть GNU awk
, вы действительно можете указать фиксированную ширину поля, например
gawk -vFIELDWIDTHS="3 4 6 8 30 8 1 3" -vOFS="\t" '{print $2,$4,$6,$8}' results.txt
0001 00000000 0.0000 mW
0001 00000050 117.5261 uW
Однако вы также можете рассмотреть решение на основе регулярных выражений - например, в perl
вы можете вывести первые три числовых значения плюс единицы мощности как:
perl -lne 'print join "\t", (/\d*\.?\d+|\b.W\b/g)[0..3]' results.txt
0001 00000000 0.0000 mW
0001 00000050 117.5261 uW
sed 's/_my//;s/_split/\i/;s/\.txt:Total Dynamic Power *= */\i/' /path/to/input