Применение операции awk к указанному столбцу c - PullRequest
2 голосов
/ 01 апреля 2020

У меня есть файл, строки которого выглядят так:

chr1 66999275 67216822 + SGIP1; SGIP1; SGIP1; SGIP1; MIR3117

Теперь я хочу отредактировать последний столбец для удаления дубликатов, так что это будет только SGIP1; MIR3117.

Если у меня есть только последний столбец, я могу использовать следующий код awk для удаления дубликатов.

a="SGIP1;SGIP1;SGIP1;SGIP1;MIR3117"
echo "$a" | awk -F";" '{for (i=1;i<=NF;i++) if (!a[$i]++) printf("%s%s",$i,FS)}{printf("\n")}'

Это возвращает SGIP1; MIR3117;

Однако я не могу понять, как я могу использовать это, чтобы повлиять только на мой пятый столбец. Если я просто передам всю строку, я получу SGIP1 два раза, так как awk затем обрабатывает все перед первой точкой с запятой как один столбец. Есть ли элегантный способ сделать это?

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

Не могли бы вы попробовать следующее.

awk '
{
  num=split($NF,array,";")
  for(i=1;i<=num;i++){
    if(!found[array[i]]++){
      val=(val?val ";":"")array[i]
    }
  }
  $NF=val
  val=""
}
1
'  Input_file

Объяснение: Добавление подробного объяснения приведенного выше кода здесь.

awk '                                   ##Starting awk program from here.
{
  num=split($NF,array,";")              ##Using split function of awk to split last field($NF) of current line into array named array with ; delimiter.
  for(i=1;i<=num;i++){                  ##Running a loop fro i=1 to till total number of elements of array here.
    if(!found[array[i]]++){             ##Checking condition if any element of array is NOT present in found array then do following.
      val=(val?val ";":"")array[i]      ##Creaating variable val and keep adding value of array here(whoever satisfy above condition).
    }
  }
  $NF=val                               ##Setting val value to last field of current line here.
  val=""                                ##Nullifying variable val here.
}
1                                       ##1 will print edited/non-edited line here.
' Input_file                            ##Mentioning Input_file name here.
0 голосов
/ 01 апреля 2020

Я не считаю его "элегантным", и он работает при определенном количестве допущений.

awk -F"+" '{printf("%s+ ",$1);split($2,a,";"); for(s in a){gsub(" ", "", a[s]); if(!c[a[s]]++) printf("%s;", a[s])}}' test.txt

Проверено на вашем входе, возвращает:

chr1 66999275 67216822 + SGIP1;MIR3117;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...