Подсчет запятой разделил символы подряд

Вот решение для 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.

4
12.07.2014, 22:29
2 ответа
[
$ awk -F '[\t,]' '{print $1, NF-1}' some_file
] [

], где[

] [
    ] [
  • ][]-F[] устанавливает разделитель полей, i. e. либо tab, либо запятая[
  • ] [
  • ][]$1[] ссылки первое поле[
  • ] [
  • ][]NF[] является встроенной переменной, которая содержит количество полей в записи[
  • ] [
  • ]оператор awk выполняется для каждой записи (i. e. для каждой строки)[
  • ] [
]
6
27.01.2020, 20:49
[
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.[][

]
2
27.01.2020, 20:49

Теги

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