2015-04-30 3 views
0

Я пытаюсь запустить следующий цикл, два оператора работают, но строка @ c awk вызывает некоторые проблемы.Подсчет данных, который действителен для двух условий в столбцах 1 и 2

printf "" >! loop.txt 

@ x = -125 
while ($x <= -114) 
    @ y = 32 
    while ($y <= 42) 
     @ c =`awk '{ for ($1 = $x*; $2 = $y*){count[$1]++}}' text.txt` 
    printf "$x $y $c\n" >> loop.txt 
    @ y++ 
    end 
@ x++ 
end 

С AWK линии, я пытаюсь сделать ссылку на файл с большим количеством различающихся значений в колонках 1 и 2 файла text.txt. Я хочу иметь возможность сначала ссылаться на все значения в столбце 1, которые начинаются с $ x (так как все они имеют несколько десятичных знаков), а затем ссылается из этого под-списка все значения в столбце 2, которые начинаются с $ y , После того, как этот второй суб-список был сформирован, я хотел бы считать все записи действительными для этих условий. Однако я продолжаю получать синтаксические ошибки в строке, и я не уверен, что использую правильную функцию!

EDIT:

исполняемый файл является .csh типа (C оболочки, я думаю)

Формат входного образца ...

-125.025 32.058 2.25 
-125.758 32.489 2.67 
-125.349 32.921 3.49 
-125.786 32.753 4.69 
-125.086 33.008 2.78 

И ожидаемый выход ...

-125 32 4 
-125 33 1 
+0

@EdMorton Я работаю в среде UNIX и использую исполняемые файлы .csh - к сожалению, я не могу предоставить гораздо больше информации, нам не говорили о том, что мы используем, просто основы ее использования ... – Conquistador

+0

@EdMorton Из одного из наших ресурсов говорится: «В NOCS вы будете использовать csh и tcsh, так называемые, потому что они имеют определенное количество синтаксиса типа C». Это только действительно строка awk, которую мне нужно попробовать, чтобы работать. – Conquistador

+0

Этот язык не является ни C shell, ни tcsh AFAIK. Вы не должны использовать [t] csh для сценариев в любом случае, поскольку это не то, для чего это (google «Csh why not»), и всякий раз, когда вы пишете цикл в оболочке, просто для управления текстом вы делаете неправильную вещь (google тоже). Оболочка UNIX - это среда, из которой можно вызвать инструменты с языком для последовательности этих вызовов, то есть всех. Инструмент UNIX для управления текстом - awk. Вся ваша проблема должна быть решена с помощью одного тривиального скрипта awk. –

ответ

1

Так это все, что вы хотите?

$ awk '{cnt[int($1)][int($2)]++} END{for (x in cnt) for (y in cnt[x]) print x, y, cnt[x][y]}' file 
-125 32 4 
-125 33 1 

Если вы хотите, чтобы указать диапазон х и у значений, просто добавьте эту проверку диапазона, прежде чем приращение элемента массива:

awk ' 
    { x=int($1); y=int($2) } 
    x>=-125 && x<=-114 && y>=32 && y<=42 { cnt[x][y]++ } 
    END { for (x in cnt) for (y in cnt[x]) print x, y, cnt[x][y] } 
' file 

Я плюю его в нескольких строк для улучшения читаемости и добавлен переменные чтобы не называть int() несколько раз для каждого поля.

Обратите внимание, что приведенное выше будет читать ваш входной файл только один раз по сравнению со сценарием, который вы отправили в своем вопросе, который будет считывать весь входной файл 132 раза, чтобы вы могли представить себе улучшение производительности только от этого, не говоря уже о старте/остановка процессов 132 раза и т. д.

Приведенное выше использование GNU awk для 2D-массивов, но может быть легко смоделировано с другими awks.

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

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