Разделение строк внутри файлов со столбцами фиксированной ширины

На этом дизайне везде написано состояние гонки. Вы не можете быть уверены, что сигналы будут доставлены по порядку или даже вообще. Если вы используете Perl, это делает его вдвойне неопределенным.

Измените дизайн таким образом, чтобы от родителя к потомку было какое-то подтверждение о получении данных. Порядок и номер доставки сигнала - вещь ненадежная, требовать портативного решения еще более безнадежно.

2
18.02.2018, 02:35
4 ответа

Вы можете сделать это в 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
4
27.01.2020, 21:48

Как насчет использования 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
6
27.01.2020, 21:48

Если у вас есть 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
6
27.01.2020, 21:48
sed 's/_my//;s/_split/\i/;s/\.txt:Total Dynamic Power *= */\i/' /path/to/input
3
27.01.2020, 21:48

Теги

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