Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在unix shell中逐列比较两个文件_Unix_Compare - Fatal编程技术网

在unix shell中逐列比较两个文件

在unix shell中逐列比较两个文件,unix,compare,Unix,Compare,我需要使用unixshell逐列比较两个文件,并将差异存储在结果文件中 例如,如果第一个文件的第一条记录的第1列与第二个文件的第一条记录的第1列匹配,则结果将作为“=”存储在结果文件中,与该列相对,但如果它发现列值存在任何差异,则需要在结果文件中打印相同的值 以下是确切的要求 文件1: id code name place 123 abc Tom phoenix 345 xyz Harry seattle 675 kyt Romil newyork 文件2: id code

我需要使用unixshell逐列比较两个文件,并将差异存储在结果文件中

例如,如果第一个文件的第一条记录的第1列与第二个文件的第一条记录的第1列匹配,则结果将作为“=”存储在结果文件中,与该列相对,但如果它发现列值存在任何差异,则需要在结果文件中打印相同的值

以下是确切的要求

文件1:

id  code name  place 
123 abc  Tom   phoenix
345 xyz  Harry seattle
675 kyt  Romil newyork
文件2:

id  code name  place
123 pkt  Rosy  phoenix
345 xyz  Harry seattle
421 uty  Romil Sanjose
预期结果文件:

id_1 id_2 code_1 code_2 name_1 name_2 place_1 place_2
=    =      abc  pkt     Tom    Rosy   =       =
=    =      =    =       =      =      =       =
675  421    kyt  uty     =      =      Newyork Sanjose

列是以制表符分隔的。

这是相当粗略的编码,但显示了一种使用
awk
发出所需内容的方法,并且可以处理相同“模式”的文件,而不仅仅是作为测试提供的特定4字段文件

这种方法使用
pr
对文件进行简单合并:将每个输入文件的同一行连接起来,向
awk
脚本显示一行

awk
脚本采用干净的输入,并使用以下事实:如果变量
n
的值为2,则脚本中
$n
的值与
$2
的值相同。因此,脚本使用
i
j
变量遍历字段对。对于测试输入,将处理字段1和5,然后处理字段2和6等

只执行了非常有限的输入测试:主要是两个输入文件(列/字段的名称)的隐含模式相同

#!/bin/sh

[ $# -eq 2 ] || { echo "Usage: ${0##*/} <file1> <file2>" 1>&2; exit 1; }
[ -r "$1" -a -r "$2" ] || { echo "$1 or $2: cannot read" 1>&2; exit 1; }

set -e

pr -s -t -m "$@" | \
awk '
  {
    offset = int(NF/2)
    tab = ""
    for (i = 1; i <= offset; i++) {
      j = i + offset
      if (NR == 1) {
        if ($i != $j) {
          printf "\nColumn name mismatch (%s/%s)\n", $i, $j > "/dev/stderr"
          exit
        }
        printf "%s%s_1\t%s_2", tab, $i, $j
      } else if ($i == $j) {
        printf "%s=\t=", tab
      } else {
        printf "%s%s\t%s", tab, $i, $j
      }
      tab = "\t"
    }
    printf "\n"
  }
'
#/垃圾箱/垃圾箱
[$#eq 2]|{echo”用法:${0##*/}“1>&2;退出1;}
[-r“$1”-a-r“$2”]|{echo”$1或$2:无法读取“1>&2;退出1;}
set-e
pr-s-t-m“$@”\
awk'
{
偏移量=整数(NF/2)
tab=“”
对于(i=1;i)/dev/stderr”
出口
}
printf“%s%s\u 1\t%s\u 2”,选项卡,$i,$j
}如果($i==$j),则为else{
printf“%s=\t=”,选项卡
}否则{
printf“%s%s\t%s”,选项卡,$i,$j
}
tab=“\t”
}
printf“\n”
}
'

在Linux上测试:GNU Awk 4.1.0和pr(GNU coreutils)8.21。

查看这篇文章你好,大卫,谢谢你的回复,但这不是我想要的,我的需求完全不同。感谢你如果能查看我的需求示例并提供帮助谢谢,这对我很有用,没有什么变化真的很感谢,它帮助了我很多