我想找到2个逗号分隔文本文件列表之间的区别

时间:2015-01-22 09:37:26

标签: file awk scripting cmd grep

我有2个逗号分隔的文本文件。

文件1包含一个逗号分隔的行

Brad@blah.com, jo@me.com.au, Josh@yahoo.co.uk

文件2包含一个逗号分隔的行

George@here.com, brad@blah.com, sister@me.com.au, jo@me.com.au, josh@yahoo.co.uk

我想显示文件2中但不在文件1中的电子邮件地址,以便生成的文件3包含文本

George@here.com, sister@me.com.au

我已经尝试使用grep找到解决方案但是任何Windows工具都没问题。

2 个答案:

答案 0 :(得分:1)

假设您有多个用逗号分隔的电子邮件地址,可选地由空格和制表符包围,

awk -F'[ \t]*,[ \t]*' 'NR == FNR { for(i = 1; i <= NF; ++i) seen[tolower($i)] } NR != FNR { for(i = 1; i <= NF; ++i) { if(!(tolower($i) in seen)) { print $i } } }' file1 file2

awk代码是

NR == FNR {                        # in the first file (overall line ==
                                   # line in file)
  for(i = 1; i <= NF; ++i) {       # for all fields in the line:
    seen[tolower($i)]              # remember that you saw it.
  }
}
NR != FNR {                        # in subsequent files (here the second)
  for(i = 1; i <= NF; ++i) {       # for all fields in the line:
    if(!(tolower($i) in seen)) {   # if you've not seen it before
      print $i                     # print it.
    }
  }
}

编辑:更简单的版本改编自@ JID的评论

awk -v RS='\n|[ \t]*,[ \t\n]*' 'NR == FNR { seen[tolower($0)] } !(tolower($0) in seen)' file1 file2

JID是正确的,使用记录分隔符可以使代码更简单 - 如果文件直接拆分为电子邮件地址记录,则for循环变得不必要。我稍微更改了他的记录分隔符,以避免在尾随逗号和换行符之间引入空记录,并允许在逗号之前留空格。

此简化方法适用于mawkgawk,这是当今最常见的问题。然而,正则表达式记录分隔符不是POSIX的一部分,所以这可能会破坏一些旧的Unices。在这种情况下,请参考第一个非简化方法。这应该适用于所有地方 - 正则表达式字段分隔符符合 POSIX。

答案 1 :(得分:0)

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET "file3line="
FOR /f "delims=" %%a IN (q28085343_file1.txt) DO (
 FOR /f "delims=" %%b IN (q28085343_file2.txt) DO (
  FOR %%s IN (%%b) DO (
   SET "found="
   FOR %%t IN (%%a) DO IF /i "%%s"=="%%t" SET found=Y
  IF NOT DEFINED found SET "file3line=%%s, !file3line!"
  )
 )
)
IF DEFINED file3line ECHO(%file3line:~0,-2%
GOTO :EOF

我使用了一个名为q28085343_file1.txtq28085343_file2.txt的文件,其中包含我的测试数据。