Вы не сказали какой сокеты.
Можно отправить (по определению) неограниченный объем данных. Если это не может все быть буферизовано или отправлено сразу или если получатель не может получить все это сразу, отправление или заблокируется (для блокирования сокетов) или возвратит частичное количество записанных байтов или EAGAIN
(для неблокирования сокетов).
Это зависит от протокола. UDPv4 поддерживает только 65 536 байтов за датаграмму. UDPv6 поддерживает намного больше. Сокеты домена UNIX, вероятно, поддерживают еще больше: Вы, вероятно, просто ограничены памятью в этом случае.
Необходимо обработать файл дважды. На первом показе Вы пишете простофилям в файл:
awk '{if (++dup[$2] == 1) print $2;}' test.html > dupes.txt
Второе выполнение сравнивает все строки с содержанием файла:
awk 'BEGIN { while (getline var <"dupes.txt") { dup2[var]=1; }};
{ num=++dup[$2]
if (num == 1) { if (1 == dup2[$2]) print $0 " acked"; else print $0;} }' \
test.html
Это было бы намного легче, если бы у нас был весь файл. Вы только интересуются началом строк host=
или какое-либо из 2-х полей? Для общего решения попробуйте это:
perl -e '@file=<>;
foreach(map{/.+?\s+(.+)/;}@file){$dup{$_}++};
foreach(@file){
chomp;
/.+?\s+(.+)/;
if($dup{$1}>1 && not defined($p{$1})){
print "$_ acked\n";
$p{$1}++;}
else{print "$_\n"}
}' test.html
Сценарий выше сначала считает весь файл, проверить на дубликаты и затем распечатать каждую дублирующуюся строку, сопровождаемую "acked".
Все это намного более просто, если мы можем предположить, что Вы только интересуетесь строками, запускающимися с down X
:
grep down test.html | awk '{printf $2}' |
perl -e 'while(<>){$dup{$_}++}open(A,"test.html");
while(<A>){
if(/host=\s+(.+)/ && defined($dup{$1})){
chomp; print "$_ acked\n"}
else{print}}'
Это могло помочь:
awk 'NR==FNR{b[$2]++; next} $2 in b { if (b[$2]>1) { print $0" acked" ; delete b[$2]} else print $0}' inputFile inputFile
awk '
NR==FNR {
## Loop through the file and check which line is repeated based on column 2
b[$2]++
## Skip the rest of the actions until complete file is scanned
next
}
## Once the scan is complete, look for second column in the array
$2 in b {
## If the count of the column is greater than 1 it means there is duplicate.
if (b[$2]>1) {
## So print that line with "acked" marker
print $0" acked"
## and delete the array so that it is not printed again
delete b[$2]
}
## If count is 1 it means there was no duplicate so print the line
else
print $0
}' inputFile inputFile