Awk - 比较两个文件,匹配一个字段,合并两个文件

时间:2012-09-12 00:03:37

标签: text awk

嘿伙计们我需要一些帮助, 我的目标是匹配查找或匹配file2

中file1的第一部分

File1中:

\\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 

和来自file2

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

2 个答案:

答案 0 :(得分:2)

如果它是 c00kiemon5ter 表示带有反斜杠的复制粘贴错误,那么对于File2中的每一行迭代File1都很简单,我假设你想要找不到匹配项时没有输出。

simple.awk

BEGIN { FS = OFS = ";" }

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

使用以下命令运行:

awk -f simple.awk File1

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

更work.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
使用\;第一个字段行结尾和打印 - 也加入第3行。

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

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