在unix shell中逐列比较两个文件
我需要使用unixshell逐列比较两个文件,并将差异存储在结果文件中 例如,如果第一个文件的第一条记录的第1列与第二个文件的第一条记录的第1列匹配,则结果将作为“=”存储在结果文件中,与该列相对,但如果它发现列值存在任何差异,则需要在结果文件中打印相同的值 以下是确切的要求 文件1:在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
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。查看这篇文章你好,大卫,谢谢你的回复,但这不是我想要的,我的需求完全不同。感谢你如果能查看我的需求示例并提供帮助谢谢,这对我很有用,没有什么变化真的很感谢,它帮助了我很多