2

嘿伙计们,我需要一些帮助,我的目标是在 file2 中匹配 find 或匹配 file1 的第一部分

文件1:

\\tempcomputer\c$\test2;test folder;c:\test2
\\tempcomputer\c$\temp;temp folder;C:\temp
\\tempcomputer\c$\unavailablefolder;c:\unavailablefolder

文件2:

\\tempcomputer\c$\test2\;2.777.768 Bytes;11/09/12;11/09/12
\\tempcomputer\c$\temp\;5.400.050.974 Bytes;10/09/12;11/09/12
Error: Invalid property element: \\tempcomputer\c$\unavailablefolder

预期输出:

\\tempcomputer\c$\test2;test folder;c:\test2;2.777.768 Bytes;11/09/12;11/09/12
\\tempcomputer\c$\temp;temp folder;C:\temp;5.400.050.974 Bytes;10/09/12;11/09/12
\\tempcomputer\c$\unavailablefolder;c:\unavailablefolder;Error: Invalid property element: \\tempcomputer\c$\unavailablefolder

例如,我想从 file1 的第一行进行比较:

\\tempcomputer\c$\test2 

在第二个文件上搜索,并从 file1 连接两个文件

\\tempcomputer\c$\test2;test folder;c:\test2 

并从文件2

c:\test2;2.777.768 Bytes;11/09/12;11/09/12

所以第一行是:

\\tempcomputer\c$\test2;test folder;c:\test2;2.777.768 Bytes;11/09/12;11/09/12

第一行的预期结果:

\\tempcomputer\c$\test2;test folder;c:\test2;2.777.768 Bytes;11/09/12;11/09/12 

第二行的预期结果:

\\tempcomputer\c$\temp;temp folder;C:\temp;5.400.050.974 Bytes;10/09/12;11/09/12

第三行的预期结果:

\\tempcomputer\c$\unavailablefolder;c:\unavailablefolder;Error: Invalid property element: \\tempcomputer\c$\unavailablefolder
4

2 回答 2

2

如果它是因为c00kiemon5ter指示带有反斜杠的复制粘贴错误,那么迭代File2中的每一行很简单File1,我假设您在找不到匹配项时不希望输出。

简单的.awk

BEGIN { FS = OFS = ";" }

{ 
  l=$0
  first=$1
  while(getline < "File2") { 
    if(first == $1) {
      print l, $0
      break
    }
  }
}

运行:

awk -f simple.awk File1

最后允许一个可选的反斜杠需要更多的工作,但是大部分额外的复杂性可以转移到一个函数中:

更多工作.awk

function optional_end(s, c) {
  if(c == "")
    c = "\\"
  if(substr(s, length(s)) == c)
    s = substr(s, 1, length(s) - 1)
  return s
}

BEGIN { FS = OFS = ";" }

{ 
  l=$0
  first = optional_end($1)

  while(getline < "File2") {
    if(first == optional_end($1)) {
      print l, $0
      break
    }
  }
}

运行:

awk -f more-work.awk File1

由 c00kiemon5ter 编辑 :3

修改simple.awk
也适用于\;第一场-行结尾和打印-加入第三行。

BEGIN { FS = OFS = ";"; if( file == "") file = "File2" }

{ 
  l=$0
  first=$1
  while(getline < file) { 
    if((idx = index($0, first))) {
      if (idx == 1)
          $1 = l
      else
          $1 = l FS $0
      print
      break
    }
  }
}

编辑 2

输入文件现在可以作为选项给出-v file=SOME_FILE;如果没有给出“File2”,则使用,例如:

awk -f simple.awk -v file=SOME_FILE File1
于 2012-09-12T03:03:31.440 回答
2

假设 File2 中的路径末尾没有终端反斜杠,则如下:

join -t ';' <(sort File1) <(sort File2)

将输出:

\\tempcomputer\c$\temp;temp folder;C:\temp;5.400.050.974 Bytes;10/09/12;11/09/12
\\tempcomputer\c$\test2;test folder;c:\test2;2.777.768 Bytes;11/09/12;11/09/12
于 2012-09-12T04:45:43.733 回答