2015-06-02 3 views
2

Недавно я столкнулся странная поведенческая проблема с awkAWK непревзойденный с пустым файлом

что у меня есть два файла, один с пустым файлом & другим являются с населенными данными

поэтому позвольте мне применить простой бесподобный код

awk -v var=0 'NR==FNR{a[$var]++;next} !($var in a)' file1 file2 

говорят

file1 

&

file 2 
a 
b 
v 

он возвращает пустой данные, где, как предполагается вернуть все содержимое файла 2. может кто-нибудь объяснить мне, как преодолеть эту проблему?

ответ

3

Нет данных в file1, поэтому общее количество записей никогда не изменяется, поэтому FNR == NR по всему file2. Я не уверен, что есть простой способ исправить это.

Вы даже не можете использовать блок BEGIN для записи текущего имени файла и места при изменении имени файла. Спецификация POSIX для awk говорит:

FILENAME Имя пути из текущего входного файла. Внутри действия BEGIN значение не определено. Внутри действия END значение должно быть именем последнего обработанного входного файла.

Я думаю, ваш лучший выбор, вероятно, будет сравнивать FILENAME с ARGV[1]:

awk -v var=0 'FILENAME==ARGV[1] {a[$var]++;next} !($var in a)' file1 file2 
+0

, но логически говоря, как массив а [] не имеет никакого значения, населенную так '$ вар в a' предполагается для печати всех непревзойденных. не так ли? – bongboy

+2

Пока он читает 'file2', он занят блоком' FNR == NR'. Он никогда не попадает в код '! (Var in a)'; вам понадобится третий файл в командной строке, чтобы добраться до него. –

+0

ОК я получил это ... спасибо .. – bongboy

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