Небольшая альтернатива, но по сути та же самая
awk '{gsub(/,/," ^ ")}1;(NR==1){gsub(/./,".")}(NR==1)' file
Этот код по существу делает следующее:
- читает строку и сохраняет ее в
$0
(этопо умолчанию, код для этого не написан) {gsub(/,/," ^ ")}
: заменить все ,
на строку " ^ "
и сохраните все в $0
1
: это сокращение, эквивалентное {print $0}
, поэтому выведите строку $0
(NR==1){action}
: Если номер записи / строки NR
равен 1, выполнить action
, где action
равно {gsub(/./,".")}
: заменить всесимволы .
.Это создает ваше подчеркивание
(NR==1)
: , что эквивалентно (NR==1)1
, что эквивалентно (NR==1){print $0}
, который указывает, равен ли номер записи / строкик одному снова напечатайте $0
, который теперь является строкой точек. - Вернитесь к 1
Примечание: баллов 4 и 5 могли бы быть объединены как (NR==1){gsub(/./,".");print $0}
Другое решение:
awk '{$1=$1}1;(NR==1){gsub(/./,".")}(NR==1)' FS=, OFS=" ^ " file
Этот код по существу выполняет следующее:
FS=, OFS=" ^ "
: Установите разделитель полей на ,
, а выходной разделитель полей - на строку " ^ "
- прочитать строку и сохранить ее в
$0
(это значение по умолчанию, для этого не написан код) {$1=$1}
: перестроить $0
с помощьюзамена всех FS
на OFS
.По сути, это эквивалентно awk '{gsub(/,/," ^ ")}
в первом случае. 1
: это сокращение, эквивалентное {print $0}
, поэтому выведите строку $0
(NR==1){action}
: Если номер записи / строки NR
равен 1, выполните action
, где action
равно {gsub(/./,".")}
: заменить все символы на .
.Это создает ваше подчеркивание
(NR==1)
: это эквивалентно (NR==1)1
, что эквивалентно (NR==1){print $0}
, который указывает, равен ли номер записи / строкик одному снова напечатайте $0
, который теперь является строкой точек. - Вернитесь к 2
Это значение может быть сокращено до
awk '($1=$1);(NR==1) && gsub(/./,".")' FS=, OFS=" ^ " file
но это становится более загадочным и не читаемым, и даже вводит крошечную возможность для ошибки (см. Комментарий Эда Мортона ниже этого поста)и легче всего отлаживать.