Как распечатать инкрементное количество входов уникальных значений в столбце 1

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

Apple_1 1 300 Apple_2 1 500 Apple_2 500 1500 Apple_2 1500 2450 Apple_3 1 1250 Apple_3 1250 2000 

И желаемый результат:

 Apple_1 1 300 1 Apple_2 1 500 1 Apple_2 500 1500 2 Apple_2 1500 2450 3 Apple_3 1 1250 1 Apple_3 1250 2000 2 

Я знаю, что я могу напечатать номер строки в awk с помощью только NR печати, но я не знаю, как сбросить его для каждого уникального значения столбца 1.

Спасибо за любую помощь, которую вы можете предложить, я ценю это.

  • как вычесть первое значение из последнего в столбце по строке в оболочке?
  • Как я могу удалить все между двумя маркерами в файле?
  • Ошибки выполнения после обновления perl в arch linux
  • Ошибка при попытке вызова find из perl
  • Вставить переменную в строку в случайное место?
  • Используйте awk / sed, чтобы удалить все, кроме шаблона соответствия в определенном столбце
  • Некоторые ошибки возникли, когда я установил lucene, модуль perl!
  • Удалите повторяющиеся строки, сохраняя порядок строк
  • 2 Solutions collect form web for “Как распечатать инкрементное количество входов уникальных значений в столбце 1”

    Стандартный трюк для этой проблемы в Awk заключается в использовании ассоциативного массива счетчиков:

     awk '{ print $0 "\t" ++count[$1] }' 

    Это подсчитывает количество раз, когда первое слово в каждой строке было замечено. Это не совсем то, о чем вы просите, поскольку

     Apple_1 1 300 Apple_2 1 500 Apple_1 500 1500 

    будет производить

     Apple_1 1 300 1 Apple_2 1 500 1 Apple_1 500 1500 2 

    (подсчет для Apple_1 не сбрасывается, когда мы видим Apple_2 ), но если сортировка ввода будет выполнена, все будет в порядке.

    В противном случае вам нужно будет отслеживать счетчик и последний вид:

     awk '{ if (word == $1) { counter++ } else { counter = 1; word = $1 }; print $0 "\t" counter }' 

    Этот ответ не дает точного результата, который вы указали, но может быть еще большим интересом для других пользователей.


    Если вам не нужны инкрементные подсчеты, а просто количество каждого уникального значения, вы можете использовать более простое:

     cut -f1 file.txt | sort | uniq -c 

    (Обратите внимание, что cut зависит от разделителей табуляции, а не только от пробелов.)


    На самом деле, поскольку ваш файл уже отсортирован в первом поле, вам не нужно его сортировать:

     cut -f1 file.txt | uniq -c 

    И если вы хотите включить их в исходный файл в качестве нового четвертого столбца, вы можете использовать join :

     cut -f1 file.txt | uniq -c | join -2 2 file.txt - 

    ( join зависит от отсортированного ввода.)

    Выходные данные на входе:

     Apple_1 1 300 1 Apple_2 1 500 3 Apple_2 500 1500 3 Apple_2 1500 2450 3 Apple_3 1 1250 2 Apple_3 1250 2000 2 

    Обратите внимание, что join считывает пробелы с пробелами в интуитивно понятном виде, будь то табуляции или пробелы, но выводит ровно одно пространство для разделителя. Если вы хотите, чтобы ваши вкладки вернулись, труба в tr ' ' '\t'

    Linux и Unix - лучшая ОС в мире.