Чтобы добавить к предыдущим превосходным ответам (настройку ~/.ssh/config
и проверку того, установлена ли переменная среды DISPLAY
на клиенте,настроив /etc/ssh/sshd_config
и установив xauth
на сервер ), также убедитесь, что xterm
установлен на клиенте, т.е.
sudo apt-get install xterm
Выражение является логическим, проверяющим, существует ли элемент массива в первый раз. Оно использует ! инвертировать условие. Но он продолжает считать .
Просто адаптируйте тест. Это отказывается печатать 6-ю и более поздние версии.
awk -F"\t" '++seen[tolower($1)] <= 5'
В обоих примерах входной файл читается дважды. На первом этапе подсчитывается первый столбец, а на втором шаге текущая строка печатается и сравнивается с подсчетом.
Печатать первое вхождение, если первый столбец встречается более пяти раз:
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)]
). Если оно встречается более пяти раз, оно удаляется из массива.
Удалите строку, если первый столбец встречается более пяти раз:
awk -F'\t' '
FNR==NR{ seen[tolower($1)]++; next }
seen[tolower($1)]<=5
' file file
Текущая строка печатается, только если количество столбцов меньше или равно пяти.
Можно сделать все это, не читая файл дважды, сохранив весь файл в массиве, что означает, что он будет работать в конвейере. Я не сравнивал, лучше ли дополнительная сложность, чем чтение файла дважды, но он обрабатывает около 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}" )