Intereting Posts
Когда * работает как символ шаблона в расширении имени файла и как параметр оболочки, значением которого являются позиционные параметры? unixODBC и iODBC одновременно установлены? выполнить скрипт с некоторым разрешением Как получить информацию о слове, размере адреса, размере адресной шины, размере шины данных и размере шины? Удалить / отключить горячий угол Почему нет иконки для некоторых файлов в File Manager (Xfce)? Rsyncing файлы со специальными символами на USB FAT32 Ошибка «Невозможно назначить запрошенный адрес» при передаче на удаленный сервер apt-get update игнорирует некоторые URL-адреса Почему этот код не работает? Политика паролей Ubuntu Как правильно установить микрофонный вход ALSA на изображении jesse linux Создайте именованный канал / fifo, который выполняет команду при чтении Скопируйте файл и добавьте метку времени Как обработать серию файлов после завершения передачи

Массив с двумя входными файлами awk

У меня есть два файла: один с NF=7 другой – NF=47

Мне нужно проверить количество вхождений $2 в файл с NF=7 . Если count <=2 , мне нужно сделать массив из того же файла, который содержит arr1[$1]=$1

Для этого действия я использовал следующий код:

 awk -F"," '{if(NF==7){arr[$2]++}}END{for(i in a){if(arr[i]<=2){print $0}}}' 

Для действия второго файла мне нужно сопоставить $1 с arr[$1]=$1 взятым из первого файла с $1 из второго файла.

Ниже приведен пример:

File1:

 1,111,,,,,, 2,111,,,,,, 3,100,,,,,, 4,111,,,,,, 

File2:

 1,799,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, 2,899,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, 3,999,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, 

Вывод:

 3,999,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, 

Вы можете сравнить NR с FNR чтобы различать обработку первого или последующих файлов. Это связано с тем, что FNR сбрасывается на каждый файл, а NR – это текущий подсчет. Поэтому только при обработке первого файла будет выполнено условие NR==FNR .

Чтобы обработать «более короткий» файл, который должен быть первым …

 awk -F, 'NR==FNR{mapper[$1]=$2;counter[$2]++}...' 

Затем, чтобы обработать «более длинный» файл, чтобы он печатался, когда ваше условие удовлетворяет …

 awk -F, 'NR!=FNR&&counter[mapper[$1]]<=2' 

Объединение обоих:

 awk -F, 'NR==FNR{mapper[$1]=$2;counter[$2]++}NR!=FNR&&counter[mapper[$1]]<=2' 

По умолчанию awk печатает всю строку, когда критерии выбора совпадают, поэтому просто указать NR!=FNR&&counter[mapper[$1]]<=2 будет достаточно.