2017-02-02 9 views
0

Здравствуйте, спасибо, что нашли время, чтобы прочитать этот вопрос. В последний день я пытался решить проблему и не приблизился к решению. У меня есть пример файла данных, который содержит следующее:AWK: подтверждение соответствия столбцов последовательных строк

[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 

Цель заключается в определении «инструкторов», которые имеют больше, чем один боец. Мое чувство кишки - это «getline» и директивы декларации переменных в AWK. Я пробовал разные комбинации

awk [email protected] 'NR>1{a=$2; getline; if($2 = a) {print $0,"Yes"} else {print $0,"NO"}}' sample.txt 

Однако, результат не достиг нужных результатов. Фактически, он даже не выводит все строки в файле образца!

Мои желаемые результаты:

[email protected] 
[email protected]@NO 
[email protected]@NO 
[email protected]@YES 
[email protected]@YES 
[email protected]@NO 
[email protected]@NO 
[email protected]@NO 
[email protected]@NO 
[email protected]@YES 
[email protected]@YES 
[email protected]@NO 
[email protected]@NO 

Я полностью утрачена, куда идти отсюда. Я искал и пытался найти решение безрезультатно, и я ищу какой-то ввод. Спасибо!

ответ

4

Не требуется getline. Можно просто обработать ввод обычно, построения импульсов в тренажере и распечатать результат в END блоке:

awk [email protected] '{ 
    lines[NR] = $0; 
    trainers[NR] = $2; 
    counts[$2]++; 
} 
END { 
    print lines[1]; 
    for (i = 2; i <= length(lines); i++) { 
    print lines[i] "@" (counts[trainers[i]] > 1 ? "YES" : "NO"); 
    } 
}' sample.txt 
1

Другой вариант, чтобы сделать два прохода:

$ cat p.awk 
BEGIN {FS=OFS="@"} 
NR==1 {print;next}; 
NR==FNR {++trainers[$2]; next} 
FNR>1 {$3=(trainers[$2]>1)?"YES":"NO"; print} 

$ awk -f p.awk p.txt p.txt 
[email protected] 
[email protected]@NO 
[email protected]@NO 
[email protected]@YES 
[email protected]@YES 
[email protected]@NO 
[email protected]@NO 
[email protected]@NO 
[email protected]@NO 
[email protected]@YES 
[email protected]@YES 
[email protected]@NO 
[email protected]@NO 

Разъяснения :

Установить разделители входных и выходных файлов:

BEGIN {FS=OFS="@"} 

печати заголовок:

NR==1 {print;next}; 

Первый проход, граф вхождений каждого тренера:

NR==FNR {++trainers[$2]; next} 

Второй проход, установленный ДА или НЕТ в зависимости от кол-тренера и результат печати:

FNR>1 {$3=(trainers[$2]>1)?"YES":"NO"; print} 

 Смежные вопросы

  • Нет связанных вопросов^_^