Как найти уникальные элементы в столбце без сортировки в Bash? - PullRequest
0 голосов
/ 30 сентября 2019

Я пытаюсь найти уникальные вхождения элементов в одном из столбцов (2-й столбец, чтобы быть конкретным) файла данных, используя bash. Я не хочу, чтобы выходные данные были отсортированы или рандомизированы. После долгих поисков я нашел решение, основанное на 'awk', которое частично сработало:

awk '{arr[$2] = 1} END {for (key in arr) {print key}}' input_file > output_file

, но вывод кажется случайным. Я хочу выполнить эту операцию таким образом, чтобы для каждого элемента проверялось его последнее вхождение. Или, другими словами, «уникальность» проверяется, начиная с конца файла. Например, если элементы расположены в следующем порядке:

5, 6, 7, 5, 6, 8, 5, 6, 9, 6, 9, 10, 10, 11, 10, 11, 12

, тогда результат должен быть:

7, 8, 5, 6, 9, 10, 11, 12

Ответы [ 2 ]

2 голосов
/ 30 сентября 2019

Подход, прочитав файл дважды: -

awk 'NR==FNR{++A[$2];next}A[$2]==++T[$2]' input_file input_file 
1 голос
/ 30 сентября 2019

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

awk '!a[$2]++{b[++count]=$2} END{for(j=1;j<=count;j++){print b[j]}}' Input_file

Это должно дать вам вывод в правильном порядке, в котором 2-е поле входит в Input_file + это позаботится об уникальности этого поля.



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

awk '                           ##Starting awk program here.
!a[$2]++{                       ##Checking condition if $2 is present in array a if NOT present then increase counter in index of array a with $2.
  b[++count]=$2                 ##Creating an array named b whose index is count variable with its increment count and its value is $2.
}
END{                            ##Starting END block of this awk program here.
  for(j=1;j<=count;j++){        ##Starting for loop here from j=1 to till value of count.
    print b[j]                  ##Printing value of array b with index of variable j here which is $2 of lines.
  }                             ##Closing BLOCK for for loop here.
}
'  Input_file                   ##Mentioning Input_file name here.
...