Вот решение для Perl:
perl -pe ' $prev=$1 if /^([\d\.]+)/; s/Blank/$prev/' file.txt
Объяснение:
Perl -p
флаг означает, "Проходят входной файл линию за линией и печатают каждую строку", -e
означает, "запускает скрипт, данный на командной строке".
$prev=$1 if /^([\d\.]+)/;
: Если строка запускается с (^
) строка чисел (\d
) и точки \.
, сохраните ту строку (IP) как $prev
. Так, поскольку сценарий читает файл, $prev
будет содержать последний найденный IP.
s/Blank/$prev/
: Замените строкой Blank
со значением $prev
.
$ awk -F '[\t,]' '{print $1, NF-1}' some_file
]
[], где[
] []-F[
] устанавливает разделитель полей, i. e. либо tab, либо запятая[]$1[
] ссылки первое поле[]NF[
] является встроенной переменной, которая содержит количество полей в записи[awk -v col=2 -F '\t' '{$col=gsub(",", "", $col)+1; print}'
]
[][] столбец [
] является параметром, представляющим номер анализируемого столбца, и []-v[
] присваивает ему 2.[
][]-F '\t'[
] устанавливает разделитель полей на символ табуляции[]1[]. [][]gsub[
][] возвращает количество замен, поэтому он используется для подсчета количества запятых. Результат присваивается анализируемому столбцу, а в окончательной []печати[
] отображаются все столбцы. [
$ cat input
AC 1,23,5
DC 2,8,89
XX 3,4,5,6,7 YYY,ZZZ
$ awk --assign col=2 -F '\t' '{$col=gsub(",", "", $col)+1; print}' < input
AC 3
DC 3
XX 5 YYY,ZZZ
]
[][][]1[] Некоторые реализации awk могут не разобрать []\t[
], и в этом случае можно использовать специальную для Bash [] цитату [] - []$'\t'[
] - которая передаст сам символ табуляции в awk.[][