, а эти учетные записи могут быть остатками неполного удаления, также возможно, что они обслуживаются извне из / etc / passwd. Проверьте вывод grep ^ login /etc/pam.conf | grep account
(при условии, что AIX> = 5.3), чтобы узнать, есть ли у вас какие-либо модули PAM, которые могут предоставлять информацию об учетной записи. LDAP, NIS и другое стороннее программное обеспечение может быть настроено для предоставления данных учетной записи и / или авторизации.
Позвольте мне добавить краткий ответ на заданный вопрос (вдохновленный появлением ответа getent
, потому что я не знаю getent для AIX):
lsuser -a login rlogin USERNAME
.. . должен запрашивать все настроенные репозитории учетных записей и сообщать вам, может ли USERNAME войти в систему или нет.
Ваша awk
программа верна, если мы изменим ее на безусловно используем
print $0","( a[$3] ? a[$3] : 0 )
вместо использования
print $0","a[$3]
, когда a[$3]
не равен -нулю или пуст. То есть используйте ноль, если поле a[$3]
равно нулю или пусто, в противном случае используйте a[$3]
.
Другими словами,
awk -F, -v OFS=',' 'FNR==NR { a[$1]=$2; next } FNR > 1 { print $0, (a[$3] ? a[$3] : 0) }' fileB fileA
Здесь мы используем FNR > 1
, чтобы пропустить заголовок.
Использованиеjoin
:
$ join -t, -1 3 -o 1.1,1.2,1.3,1.4,2.2 fileA fileB
1,1990,I001,2473264,2.3 GHz
2,1991,I002,2473265,2.3 GHz
3,1992,I004,2473266,2.3 GHz
4,1993,6050,912432,1.8 GHz
5,1994,6003,912433,850 MHz
Если файлы не отсортированы по ключу соединения, то (в оболочке, поддерживающей подстановки процессов):
$ join -t, -1 3 -o 1.1,1.2,1.3,1.4,2.2 <( sort -t, -k3,3 fileA ) <( sort fileB )
5,1994,6003,912433,850 MHz
4,1993,6050,912432,1.8 GHz
1,1990,I001,2473264,2.3 GHz
2,1991,I002,2473265,2.3 GHz
3,1992,I004,2473266,2.3 GHz
join
выполнит операцию INNER JOIN
над двумя файлами. -t,
сообщает join
, что запятые являются разделителем полей, и мы выбираем третье поле в качестве ключа соединения в первом файле с-1 3
(первое поле во втором файле считается ключом, если мы не используем -2 N
для того же другого поля N
в этом файле ).
Флаг -o
сообщает join
, какие поля мы хотели бы включить в вывод и из какого файла(x.y
означает столбец y
из файлаx
).
join
— очень быстрая операция, но она требует сортировки входных файлов по ключу соединения (нам просто повезло с первым примером выше ). Окончательный вывод во втором примере выше не отсортирован по отношению к первому полю , но вы можете легко исправить это, передав его через sort -k1,1n
.
Для второго сценария с несоответствием
$ join -t, -1 3 -o1.1,1.2,1.3,1.4,2.2 -a 1 -e 0 <( sort -t, -k3,3 fileA ) <( sort fileB )
5,1994,6003,912433,850 MHz
6,1995,6004,21234,0
4,1993,6050,912432,1.8 GHz
A,B,C,D,0
1,1990,I001,2473264,2.3 GHz
2,1991,I002,2473265,2.3 GHz
3,1992,I004,2473266,2.3 GHz
Добавляя -a 1 -e 0
, мы просим join
всегда выводить все поля из первого файла(-a 1
)и вставлять нули для каждого поля, отсутствующего во втором файле.
Как видите, теперь мы получаем правильный результат, но заголовок из первого файла также включен (, потому что мы просили об этом ). Если вы хотите удалить заголовки из данных обоих файлов (и отсортировать результат ), то
$ join -t, -1 3 -o1.1,1.2,1.3,1.4,2.2 -e 0 -a1 <( tail -n +2 fileA | sort -t, -k3,3 ) <( tail -n +2 fileB | sort ) | sort -k1,1n
1,1990,I001,2473264,2.3 GHz
2,1991,I002,2473265,2.3 GHz
3,1992,I004,2473266,2.3 GHz
4,1993,6050,912432,1.8 GHz
5,1994,6003,912433,850 MHz
6,1995,6004,21234,0
Эта команда будет работать в обоих сценариях.
Использование GNUjoin
с расширенными данными и первым выходным форматом , плюс echo
и tail
для замены заголовка, (, потому что join
путается несогласованные заголовки):
echo A,B,C,D,E
join -t ',' --header --nocheck-order test1 test2 \
-a 1 -e NA -1 3 -2 1 -o 1.1,1.2,2.2,1.3,1.4 | tail -n +2
Выход:
A,B,C,D,E
1,1990,2.3 GHz,I001,2473264
2,1991,2.3 GHz,I002,2473265
3,1992,2.3 GHz,I004,2473266
4,1993,1.8 GHz,6050,912432
5,1994,850 MHz,6003,912433
6,1995,NA,6004,21234