还有一次尝试用AWK做“vlookup”的事情

问题描述 投票:-1回答:1

只是在开始之前做出澄清:脚本需要运行的服务器是AIX盒子。 Shell是KSH,所以我没有Bash提供的高级功能。

好的,这就是我需要完成的事情:

我有两个文件。它们都有两列,用逗号分隔。

文件“A”有~170K行,看起来像这样:

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\

在boh情况下,第1列是文件名,第2列是它的路径。

我需要的:

对于文件A中的每一行,获取文件名,在文件B中查找,并撰写换行符,以回显/打印到由以下三个字段组成的新文件“C”中:第1列:文件的路径为文件B中显示。第2列:文件的路径,如文件A所示。第3列:文件名。

我曾试图保持简短,因为我曾被“指责”过去问题中的单词腹泻,但如果我遗漏了重要的细节,请随时告诉我。

只是你知道,我有工作批处理和ksh代码,这对于较小(较小的行)文件工作正常,在这种情况下,没有人能完成这项工作。 (CMD批处理一小时只处理几千行,而ksh批处理根据内存限制甚至拒绝读取这些文件。)

谢谢你们一直在那里!

马丁。

awk ksh
1个回答
1
投票

如果您无法访问ksh93(我认为AIX使用ksh88,而不是ksh93?),bash,zsh或其他了解<(command)重定向的shell,它就像3行和几个临时文件...

$ 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

(如果一个或两个文件已经按文件名排序,则会更少。)

如果你有其中一个shell:

$ join -t, -j1 -o '2.2 1.2 0' <(sort -t, -k1 filea) <(sort -t, -k1 fileb) > filec
© www.soinside.com 2019 - 2024. All rights reserved.