Хотя я думаю, что решение sed
- ваш лучший выбор, поскольку вы пометили свой вопрос как sed
и awk
, решение awk
довольно простое, также с использованием split()
и базовой строкиконкатенации. (только не так коротко) Например, вы можете сделать:
awk -v OFS=, -F, '{
for (i=1; i<=NF; i++) {
n=split ($i, a,".")
if (n > 2) {
s=a[1] "." a[2]
for (j=3; j<=n; j++)
s = s a[j]
$i=s
}
}
}1'
Где вы определяете разделитель полей и разделители полей вывода как ','
. Затем зацикливаясь на каждом поле, проверьте возвращаемое значение split()
, разбив поле на массив на '.'
на массив a
. Если полученное количество элементов превышает 2
, соберите вместе первые два элемента, восстановив первый '.'
в числе, а затем просто объедините оставшиеся поля. 1
в конце - это «печать по умолчанию» для печати обновленной записи.
Пример использования / Вывод
$ echo '0.592922148,0.821504176,1.174.129.731' |
> awk -v OFS=, -F, '{
> for (i=1; i<=NF; i++) {
> n=split ($i, a,".")
> if (n > 2) {
> s=a[1] "." a[2]
> for(j=3;j<=n;j++)
> s = s a[j]
> $i=s
> }
> }
> }1'
0.592922148,0.821504176,1.174129731