Объединение двух файлов в поле

, а эти учетные записи могут быть остатками неполного удаления, также возможно, что они обслуживаются извне из / etc / passwd. Проверьте вывод grep ^ login /etc/pam.conf | grep account (при условии, что AIX> = 5.3), чтобы узнать, есть ли у вас какие-либо модули PAM, которые могут предоставлять информацию об учетной записи. LDAP, NIS и другое стороннее программное обеспечение может быть настроено для предоставления данных учетной записи и / или авторизации.

Позвольте мне добавить краткий ответ на заданный вопрос (вдохновленный появлением ответа getent , потому что я не знаю getent для AIX):

lsuser -a login rlogin USERNAME

.. . должен запрашивать все настроенные репозитории учетных записей и сообщать вам, может ли USERNAME войти в систему или нет.

1
21.04.2018, 15:16
2 ответа

Ваша 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

Эта команда будет работать в обоих сценариях.

0
28.01.2020, 00:36

Использование 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
0
28.01.2020, 00:36

Теги

Похожие вопросы