удалить повторяющиеся строки, длина которых превышает

Чтобы добавить к предыдущим превосходным ответам (настройку ~/.ssh/configи проверку того, установлена ​​ли переменная среды DISPLAYна клиенте,настроив /etc/ssh/sshd_configи установив xauthна сервер ), также убедитесь, что xtermустановлен на клиенте, т.е.

sudo apt-get install xterm
1
04.12.2019, 11:51
3 ответа

Выражение является логическим, проверяющим, существует ли элемент массива в первый раз. Оно использует ! инвертировать условие. Но он продолжает считать .

Просто адаптируйте тест. Это отказывается печатать 6-ю и более поздние версии.

awk -F"\t" '++seen[tolower($1)] <= 5'
0
27.01.2020, 23:56

В обоих примерах входной файл читается дважды. На первом этапе подсчитывается первый столбец, а на втором шаге текущая строка печатается и сравнивается с подсчетом.

  1. Печатать первое вхождение, если первый столбец встречается более пяти раз:

    awk -F'\t' '
      FNR==NR{ seen[tolower($1)]++; next }
      seen[tolower($1)]
      seen[tolower($1)]>5{ delete seen[tolower($1)] }
    ' file file
    

    Текущая строка печатается только в том случае, если первый столбец существует в массиве(seen[tolower($1)]). Если оно встречается более пяти раз, оно удаляется из массива.

  2. Удалите строку, если первый столбец встречается более пяти раз:

    awk -F'\t' '
      FNR==NR{ seen[tolower($1)]++; next }
      seen[tolower($1)]<=5
    ' file file
    

    Текущая строка печатается, только если количество столбцов меньше или равно пяти.

0
27.01.2020, 23:56

Можно сделать все это, не читая файл дважды, сохранив весь файл в массиве, что означает, что он будет работать в конвейере. Я не сравнивал, лучше ли дополнительная сложность, чем чтение файла дважды, но он обрабатывает около 275 000 строк в секунду. Я часто использую массив awk размером до 400 МБ, поэтому объем данных не должен быть проблемой.

Показывает размер входного файла и количество ключей.

Paul---) wc  53.txt
 100008  187520 1100108 53.txt
Paul---) cut -f1 53.txt | sort | uniq -c
  12500 Can
  12500 Care
  12500 If
  12500 Major
  12500 Minor
  12500 Not
      5 Oak
  12500 Sample
      1 Spruce
      2 Willow
  12500 With

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

Paul---) time cat 53.txt |./5fold
Ln   5590 Num 5 Key :Oak: Oak   Fifth
Ln   8654 Num 2 Key :Willow: Willow Pattern China
Ln  13427 Num 1 Key :Spruce: Spruce Only One
Ln  65309 Num 5 Key :Oak: Oak   Fourth
Ln  70988 Num 5 Key :Oak: Oak   Third
Ln  83982 Num 5 Key :Oak: Oak   Second
Ln  87439 Num 5 Key :Oak: Oak   First
Ln  99977 Num 2 Key :Willow: Willow Weep for Me

real    0m0.359s
user    0m0.324s
sys 0m0.048s

Этот код проверен.

#! /bin/bash

AWK='''
BEGIN { FS = "\t"; nMax = 5; }
function List (Local, j) {
    for (j = 1; j in X; ++j) {
        if (N[K[j]] <= nMax)
            printf ("Ln %6d Num %d Key :%s: %s\n", j, N[K[j]], K[j], X[j]);
    }
}
{ ++N[$1]; K[NR] = $1; X[NR] = $0; }
END { List( ); }
'''
    awk -f <( echo "${AWK}" ) 
0
27.01.2020, 23:56

Теги

Похожие вопросы