Заменить повторяющиеся значения первого столбца символом " - PullRequest
2 голосов
/ 22 октября 2019

Пример ввода:

a:g:h:e:f:n
a:u:r:t:w:r
a:g:r:o:p:q
d:h:t:y:r:o
d:n:t:s:d:f
d:g:h:u:i:m:
d:s:e:r:t:y
n:m:k:s:t:r
n:r:t:y:w:g

Ожидаемый результат:

a:g:h:e:f:n
":u:r:t:w:r
":g:r:o:p:q
d:h:t:y:r:o
":n:t:s:d:f
":g:h:u:i:m:
":s:e:r:t:y
n:m:k:s:t:r
":r:t:y:w:g

Заменить дубликаты первого столбца на ", пока не будет найдено другое значение. Это то, что я нашел близко, нозамена по всему файлу:

awk '{for(i=1;i<=NF;i++){if(x<27&&$i=="old"){x++;sub("old","new",$i)}}}1' input_file

Ответы [ 2 ]

1 голос
/ 22 октября 2019

Не могли бы вы попробовать следующее (Так как OP упомянул, что os - это Sun os, используйте nawk).

nawk -v var="\"" '
 BEGIN{
   FS=OFS=":"
   }
 {
   $1=++a[$1]>1?var:$1
 }
 1
' Input_file

Поскольку вы используете Sun os, используя nawk в приведенном выше коде. Этот код НЕ будет зависеть от порядка первого поля, независимо от его порядка, это должно работать.

1 голос
/ 22 октября 2019

Использование awk:

$ awk 'BEGIN{FS=OFS=":"}{t=$1;if($1==p)$1="\"";p=t}1' file

Вывод:

a:g:h:e:f:n
":u:r:t:w:r
":g:r:o:p:q
d:h:t:y:r:o
":n:t:s:d:f
":g:h:u:i:m:
":s:e:r:t:y
n:m:k:s:t:r
":r:t:y:w:g

Объяснение:

$ awk '
BEGIN {
    FS=OFS=":"     # field delimiters
}
{
    t=$1           # 1st field to tmp
    if($1==p)      # if current equals previous
        $1="\""    # replace with "
    p=t            # previous form tmp
}1' file           # output

Обновление : Использование sub:

$ awk 'BEGIN{FS=":"}{t=$1;if($1==p)sub(/^[^:]*/,"\"");p=t}1' file
...