Я хочу найти дубликаты в файле и добавить символ в конец строки на 1-м соответствии

Вы не сказали какой сокеты.

Потоковые сокеты

Можно отправить (по определению) неограниченный объем данных. Если это не может все быть буферизовано или отправлено сразу или если получатель не может получить все это сразу, отправление или заблокируется (для блокирования сокетов) или возвратит частичное количество записанных байтов или EAGAIN (для неблокирования сокетов).

Датаграммные сокеты

Это зависит от протокола. UDPv4 поддерживает только 65 536 байтов за датаграмму. UDPv6 поддерживает намного больше. Сокеты домена UNIX, вероятно, поддерживают еще больше: Вы, вероятно, просто ограничены памятью в этом случае.

2
04.06.2013, 01:21
3 ответа

Необходимо обработать файл дважды. На первом показе Вы пишете простофилям в файл:

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
1
27.01.2020, 22:06
  • 1
    Привет Hauke, почти работал, просто должен был изменить awk '{если (++ дубликат [2$] == 1) печатают 2$;}' test.html> dupes.txt к awk '{если (++ дубликат [2$] == 2) печатают 2$;}' test.html> dupes.txt –  Sean 03.06.2013, 19:21
  • 2
    Извините я должен был сказать спасибо за Вас, помогают и очень быстрый ответ. –  Sean 03.06.2013, 19:30

Это было бы намного легче, если бы у нас был весь файл. Вы только интересуются началом строк 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}}' 
1
27.01.2020, 22:06

Это могло помочь:

Острота:

awk 'NR==FNR{b[$2]++; next} $2 in b { if (b[$2]>1) { print $0" acked" ; delete b[$2]} else print $0}' inputFile inputFile

Explaination:

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
1
27.01.2020, 22:06

Теги

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