区分两个文本文件,同时排除前导空格和尾随逗号

时间:2017-05-16 20:56:37

标签: awk

有没有办法检查file1是否包含与file2不同的内容,不包括前导空格和尾随逗号。

File1中:

1  
  2  
3,  
4  
5  

File2:

1  
2  
3  
5  

如果我跑:

awk 'FNR==NR{a[$0]++;next}!($0 in a)' file2 file1

它返回2 3,4。但是我们需要它只返回4。

3 个答案:

答案 0 :(得分:1)

假设您只是想知道它们是否有所不同,而不需要不同的内容,您可以diff进行流程替换:

diff -wq <(sed 's/,$//' file1) <(sed 's/,$//' file2)
[[ $? -ne 0 ]] && echo "Files differ!"

答案 1 :(得分:1)

diff -U0 <(sed 's/^[ ]*//;s/,$//' file1) <(sed 's/^[ ]*//;s/,$//' file2) | sed '/@@/d;s/^.//;1,2d'

diff -U0 <(sed 's/^[ ]*//;s/,$//' file1) <(sed 's/^[ ]*//;s/,$//' file2)会导致: 选项-U0告诉diff在差异之前和之后打印0个公共行。

--- /dev/fd/63  2017-05-16 14:37:00.565871029 -0700
+++ /dev/fd/62  2017-05-16 14:37:00.565871029 -0700
@@ -4 +3,0 @@
-4

将此输出发送到sed并删除标题并删除diff标记将导致4

/^@@/d - 表示删除所有以@@开头的行。如果存在多个非连续差异,这将非常有用。

s/^.// - 表示删除第一个字符。第一个字符可以是' ',两个文件都是通用的,'-'仅在第一个文件上,'+'仅在第二个文件上。

1,2d - 表示删除前两行。

或者如果你不喜欢补丁格式差异,你可以运行

diff <(sed 's/^[ ]*//;s/,$//' file1) <(sed 's/^[ ]*//;s/,$//' file2) | sed '/^[^<>|]/d;s/^..//'

上述命令无法正常运行,因为您正在运行Windows。

使用您拥有的工具:

awk '{split(tolower($0),b,",");split(b[1],b," ")} FNR==NR{a[b[1]]++;next}!(b[1] in a)' file2 file1

tolower(string) - 将返回小写字符串的副本。这将使比较案例不敏感。 $0中的原始值完好无损。

split(string,array,fs)会将string分割为array,从索引1开始,使用fs作为分隔符。

答案 2 :(得分:0)

您还可以将不需要的前缀/后缀添加到记录分隔符中:

awk -v RS='[\n ,]+' 'FNR==NR{a[$0]++;next}!($0 in a)' file2 file1