我有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工具都没问题。
答案 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循环变得不必要。我稍微更改了他的记录分隔符,以避免在尾随逗号和换行符之间引入空记录,并允许在逗号之前留空格。
此简化方法适用于mawk
和gawk
,这是当今最常见的问题。然而,正则表达式记录分隔符不是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.txt
和q28085343_file2.txt
的文件,其中包含我的测试数据。