2013-11-26 7 views
0

Имеет ли Awk ограничение на количество данных, которое он может обрабатывать?Проблемы с функцией AWK

for i in "052" "064" "060" "070" "074" "076" "178" 
do 
     awk -v f="${i}" -F, 'match ($1,f) { print $2","$3 }' uls.csv > ul$i.csv 
     awk -v f="${i}" -F, 'match ($1,f) { print $2","$3 }' dls.csv > dl$i.csv 
     awk -v n="${i}" -F, 'match ($1,n) { print $2","$3 }' dlsur.csv >> dlu$i.csv 
     awk -v k="${i}" -F, 'match ($1,k) { print $2","$3 }' dailyd.csv >> dla$i.csv 
     awk -v m="${i}" -F, 'match ($1,m) { print $2","$3 }' dailyu.csv >> ula$i.csv 

done 

Когда я запускаю этот фрагмент кода, он в основном извлекает данные из файлов csv и создает новые файлы. этот фрагмент кода работает отлично. , но когда я добавляю дополнительный файл (в цикле for), например «180», он создаст этот файл, но также будет содержать несколько строк данных из других файлов. Я много раз перебирал код. Я даже проверил необработанные данные, прежде чем он войдет в этот цикл, и все правильно. Это похоже на сбой в awk. Нужно ли применять функцию ожидания так, чтобы она могла догнать?

+0

Ваше регулярное выражение очень общее; вы уверены, что это просто не соответствует больше строк, чем предполагалось? – chepner

+0

Это не так. Каждая из этих строк имеет уникальный идентификатор, который также частично является именем файла, поэтому все теги - 052 и 064. – user2883071

+2

Но может ли строка появляться в другом месте в строке? '$ 0' - это вся строка, а не первое поле. Возможно, вы хотите «match ($ 1, f)» вместо этого. – chepner

ответ

1

Также что-то вроде

for file in uls dls dlsur dailyd dailyu; do 
    awk -F, -vOFS=, -vfile=$i '$1 ~ /052|064|060|070|074|076|178/ {print $2,$3 >> file$1.csv}' $file.csv 
done 

, вероятно, лучше, если он делает то, что вы хотите. Слишком много вызовов awk и циклов в ваших файлах. (Немного разные имена выходных файлов.Это было бы исправно, но усложняло бы скрипт немного больше, чем я считал необходимым для этой цели.)

1

Нет. То, что вы говорите, что вы думаете, не может произойти - awk НЕ будет случайным образом данные из не указанных файлов и помещают их в выходной поток.

Обратите внимание, что в вашей третьей и последующих строках вы используете '>>' вместо '>' для вашего перенаправления вывода - вы учли это?

Если вы обновите свой вопрос (т. Е. НЕ пытайтесь сделать это в комментарии!), Чтобы сообщить нам, что вы пытаетесь сделать с некоторым представительным образцом ввода и ожидаемым выходом (всего 2 входных файла, а не 5, следует достаточно, чтобы объяснить вашу проблему), мы можем помочь вам написать правильный скрипт для этого.

+0

Теперь это работает, просто у меня возникли проблемы с попыткой выяснить, почему это сработало. – user2883071

+0

Если вы не знаете, что вызвало проблему, то как вы знаете, что она не появится снова в будущем, когда у вас есть какой-то другой вход в ваши файлы?Очевидно, что это что-то вроде того, как вы анализируете свой вход, который вызывал вашу проблему, поскольку, изменяя, где вы смотрите во входном файле, вы изменили вывод, но это, конечно же, не означает, что вы решили проблему, просто проблема исчезла на данный момент с учетом вашего текущего, определенного набора входных данных. Он будет появляться в будущем, когда вы меньше всего ожидаете, поскольку у вас есть фундаментальное непонимание того, как подойти к проблеме. –

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