使用AWK进行“ vlookup”操作的另一种尝试

时间:2019-02-19 15:00:52

标签: awk ksh

在开始之前仅作澄清:需要运行脚本的服务器是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”有约200万行,看起来像这样:

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批处理每小时仅处理几千行,而ksh则基于内存限制甚至拒绝读取此类文件。)

谢谢你们一直在那里!

马丁。

1 个答案:

答案 0 :(得分: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

(较少一个或两个文件已按文件名排序)。

如果您这样做具有以下外壳之一:

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