Еще одна попытка сделать vlookup с помощью AWK - PullRequest
0 голосов
/ 19 февраля 2019

Просто пояснение перед запуском: сервер, на котором должен запускаться скрипт, - это AIX box.Shell - это KSH, поэтому у меня нет расширенных функций, которые предоставляет Bash.

Хорошо, вот что мне нужно сделать:

У меня есть два файла.У них обоих есть два столбца, разделенных запятой.

Файл "A" имеет ~ 170 тыс. Строк и выглядит так:

0000A7AED4F0C9FB1ADC14134700CadsevDDD4A000CEDCF.ext,\\server000005\F$\DICE\0035\
0000C3793C4CD6095947E44618D4Eadsev397460011D036.ext,\\server000005\F$\DICE\0020\
0001168DDDA4DF294E37753FE891BadsevB33900011EEA3.ext,\\server000005\F$\DICE\0088\
00014E6A3AFF0911D95A933778895adsev6C81E00088E97.ext,\\server000005\F$\DICE\0009\
0001A65FA90EC0E6640E1589C4B66adsev6FE1F00088EB9.ext,\\server000005\F$\DICE\0009\
0001C5AA0A9AC8E4EDFC69C483160adsev881CC001157ED.ext,\\server000005\F$\DICE\0034\
0003270ED2D2AB11739029711A233adsev55605000CFC63.ext,\\server000005\F$\DICE\0028\
000327C08A0ECD8F23EE6AE42B3C3adsevE35F00011481D.ext,\\server000005\F$\DICE\0061\
0003423C2592EF9D0AD9A7E2B595Cadsev6ABD9000D3501.ext,\\server000005\F$\DICE\0022\
00035862746EFB2098EC965F31328adsev66800000DA8CF.ext,\\server000005\F$\DICE\0021\

Файл "B" имеет ~ 2 млн. Строк,и это выглядит так:

0000294A3F3997slredA9D7ADBEE0C0CDE67C100001245C.nlo,\\server000002\F$\RESTORE_DICE\DICE\0083\
00003FFF21F5DAslred8F20FCF0A5CEE9920A4A00016835.nlo,\\server000002\F$\RESTORE_DICE\DICE\0029\
00005B1FFB996Fslred065F708695ADDD987AF9002139AD.nlo,\\server000002\F$\RESTORE_DICE\DICE\0157\
00005CF3C87456slred41FDB077914EB04FFA2B001F9D74.nlo,\\server000002\F$\RESTORE_DICE\DICE\0103\
00006BD33D737FslredD717F08A20F44F2B878500011050.nlo,\\server000002\F$\RESTORE_DICE\DICE\0094\
00008254F4D661slred6C05CFC91D9BCB82EDD800077FFA.nlo,\\server000002\F$\RESTORE_DICE\DICE\0082\
000092391392E3slredB744E98697FA39CEEDCD0004FB66.nlo,\\server000002\F$\RESTORE_DICE\DICE\0032\
0000945EDBB916slredAB08CD7AA8B825E1F55C0000FDC0.nlo,\\server000002\F$\RESTORE_DICE\DICE\0093\
0000C3793C4CD6slredE44618D4E0A2C50397460011D036.nlo,\\server000002\F$\RESTORE_DICE\DICE\0146\
0000D0DA56260DslredF30BCC9CDFF2A4556A7500039400.nlo,\\server000002\F$\RESTORE_DICE\DICE\0054\

В некоторых случаях столбец 1 - это имя файла, а столбец 2 - его путь.

Что мне нужно:

для каждой строкив файле A возьмите имя файла, найдите его в файле B и составьте новую строку, которая будет выведена на экран / распечатана в новый файл «C», состоящий из следующих трех полей: Столбец 1: Путь к файлу, как показано в файлеB. Колонка 2: путь к файлу, как показано в файле A. Колонка 3: Имя файла.

Я пытался сократить его, поскольку меня «обвиняли» в поносе слов в предыдущих вопросах,но не стесняйтесь, дайте мне знать, если я упустил важные детали здесь.

Просто, чтобы вы знали, у меня есть рабочие пакетные и ksh-коды для этого, которые прекрасно работают с меньшими (меньшими строками) файлами, хотя ни одинони делают работу в этом случае.(CMD Batch one обрабатывает только пару тысяч строк в час, в то время как ksh один отказывается даже читать такие файлы из-за ограничений памяти ..)

Спасибо вам, ребята, что вы всегда здесь!

Мартин.

1 Ответ

0 голосов
/ 19 февраля 2019

Это похоже на 3 строки и пару временных файлов, если у вас нет доступа к ksh93 (я думаю, AIX использует ksh88, а не ksh93?), Bash, zsh или другую оболочку, которая понимает перенаправление <(command) ...

$ sort -t, -k1 filea > sorted_filea
$ sort -t, -k1 fileb > sorted_fileb
$ join -t, -j1 -o '2.2 1.2 0' sorted_filea sorted_fileb > filec

(меньше, если один или оба файла уже отсортированы по имени файла.)

Если у вас do есть одна из этих оболочек:

$ join -t, -j1 -o '2.2 1.2 0' <(sort -t, -k1 filea) <(sort -t, -k1 fileb) > filec
...