有没有办法检查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。
答案 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