来自第N行的文件的差异

时间:2014-12-09 10:34:57

标签: awk sed

我试图找出两个文本文件的区别。但是,第一行总是可以改变。出于这个原因,我从python中执行了这个:

tail -n +2 file1
tail -n +2 file2

然后比较我匹配输出的结果。

但是,如果可能,我想使用awksed

到目前为止我发现的是:

awk 'NR == FNR { A[$0]=3; next } !A[$0]' file2 file1

但是从第一行开始比较。

如何从第二行进行区分?

4 个答案:

答案 0 :(得分:4)

您可以将diffprocess substitution:

一起使用
diff <(tail -n +2 file1) <(tail -n +2 file2)

答案 1 :(得分:3)

您可以编写类似

的内容
awk 'NR == FNR { A[$0]=3; next } !A[$0]&&FNR>1' file2 file1
  • FNR>1对于每个读取的文件,FNR值都会重置为1。因此FNR>1从第二行开始选择所有行。

答案 2 :(得分:2)

所有当前的AWK答案都不会显示文件之间的差异,它们只会显示一个文件是否包含来自另一个文件的行,而不考虑顺序或出现次数。

一种逐行比较的awk方式。

awk 'NR==FNR{A[FNR]=$0}FNR>1&&!(A[FNR]==$0)' file1 file2

如果要输出两条线(类似于diff(ish))

awk 'NR==FNR{A[FNR]=$0}
     FNR>1&&!(A[FNR]==$0){
     print "Line:",FNR"\n"ARGV[1]":"A[FNR]"\n->\n"ARGV[2]":"$0"\n"
     }' file file2

解释

  • 设置一个数组,其中文件记录号(FNR)作为第一个文件行的键。
  • 检查第二个文件中的行是否与第一个文件的FNR相同。
  • 如果不打印

第二个主要是输出的格式化。

  • 它输出FNR,首先输出到awk(filename1),从数组行,箭头,第二个arg到awk(filename2),从file2输出

答案 3 :(得分:1)

除nu11p01n73R解决方案外,您始终可以使用<(...)作为输入文件:

awk 'NR == FNR { A[$0]=3; next } !A[$0]' <(tail -n+2 f2) <(tail -n+2 f1)