2012-03-27 3 views
2

У меня есть файл с моими строками, и я хочу сравнить строки, которые один за другим проверять, являются ли они одинаковыми, за исключением последнего столбца. Например:Тестирование двух смежных строк

example/example 321 
example/example 456 
otherexample/otherexample 321 

В этом случае, я хочу, чтобы программа просто вернуться:

example/example 

Как совпадает с первой колонки, а второй столбец отличается. Каков наилучший способ сделать это с помощью инструментов Unix? До сих пор я пробовал awk, но имел небольшой успех. Огромное спасибо.

ответ

2
# sample data 
$ cat input.txt 
example/example 321 
example/example 456 
example/example 789 
otherexample/otherexample 321 
abc 
otherexample/otherexample 321 

$ awk 'x==$1{print $1; while(getline){if(x!=$1)break}}{x=$1}' input.txt 
example/example 
+0

Большое спасибо! Работает как шарм. Хотя, я очень новичок в awk, и я не уверен, что я полностью понимаю внутреннюю работу этого кода, поэтому у меня есть несколько вопросов: 1. В чем разница между '==' и '= ' знак. Я знаю, что на многих языках задается переменная, а другая эквивалентность тестов - это то же самое с awk? 2. Почему печать $ 1; перед циклом while, а не в конце? Большое спасибо! – samturner

+0

'==' имеет то же значение, что и в 'C++'. Вы можете поставить 'print $ 1' после' while ... loop'. – kev

0

Один из способов:

Содержание script.awk:

## In first line, get path and init counter of consecutive paths. 
FNR == 1 { 
    path = $1 
    repeats = 1 
    next 
} 

FNR > 1 { 
    ## If current path is same as previous one, increment counter. 
    if (path == $1) { 
     ++repeats; 
    } 
    ## Else, there is new path, so print previous and init counter. 
    else { 
     print_repeated_path(repeats, path) 
     path = $1 
     repeats = 0 
    } 
} 

END { 
    print_repeated_path(repeats, path) 
} 

function print_repeated_path(r, path) { 
    if (r > 1) { 
     printf "%s\n", path 
    } 
} 

Содержание infile:

example/example 321 
example/example 456 
otherexample/otherexample 321 
other/example 456 
other/example 678 
other/example 123 
otherexample/otherexample 321 

Выполнить это нравится:

awk -f script.awk infile 

С следующий результат:

example/example 
other/example 
0
sort -u temp.txt|awk '{a[$1]++}END{for (i in a){if(a[i]>1)print i;}}' 
0

Это может работать для вас:

cut -d' ' -f1 file | sort | uniq -d 

или это:

sort file | sed '$!N;/^\(\S*\) .*\n\1.*/!D;bb;:a;$!N;:b;s//\1/;ta;P;D' 
Смежные вопросы