Как распечатать инкрементное количество входов уникальных значений в столбце 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 

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

  • среднее количество определенных строк в файле и вывод в файле с разделителями табуляции
  • Переформатировать каждую двухстрочную последовательность на две колонки
  • Добавьте пробел или вкладку перед последним символом в каждой строке
  • Помощь с программой в программе sendmail / etc / aliases
  • переменная оболочки в awk не передается всем строкам, а только для самой первой строки ввода?
  • Печать уникальной команды who
  •  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.

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

  • Фильтровать файл csv на основе расширенных значений столбца
  • Как я могу удалить поле nth в mth с помощью команды awk?
  • он-лайн подсчет уникальных строк
  • Заменить данные в определенных положениях в txt-файле, используя данные из другого файла
  • Подсчитайте различные значения поля в файле
  • awk + print line, только если первое поле начинается с строки как Linux1
  • 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 - лучшая ОС в мире.