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
AWK-in-shell脚本-如何基于共享密钥(2个公共字段)比较和合并两个文件?_Shell_Unix_Awk_Ksh - Fatal编程技术网

AWK-in-shell脚本-如何基于共享密钥(2个公共字段)比较和合并两个文件?

AWK-in-shell脚本-如何基于共享密钥(2个公共字段)比较和合并两个文件?,shell,unix,awk,ksh,Shell,Unix,Awk,Ksh,有人能帮我比较一下这两个文件吗, 我使用了下面的命令,但我无法成功 awk-F,'NR==FNR{a[$1,$2];下一个}$1,$2在'temp1.dat temp2.dat中 这是我的需要, 需要比较下面两个dat文件中的前两个字段,并按照预期合并file3first字段、second字段、temp1.dat的3字段和temp2.dat的3字段中的结果 文件1:temp1.dat A, AB,100 B,BB,200 C,CC,300 文件2:temp2.dat A,AB,10 C,CC,

有人能帮我比较一下这两个文件吗, 我使用了下面的命令,但我无法成功

awk-F,'NR==FNR{a[$1,$2];下一个}$1,$2在'temp1.dat temp2.dat中

这是我的需要, 需要比较下面两个dat文件中的前两个字段,并按照预期合并file3first字段、second字段、temp1.dat的3字段和temp2.dat的3字段中的结果

文件1:temp1.dat

A, AB,100
B,BB,200
C,CC,300
文件2:temp2.dat

A,AB,10
C,CC,30
D,DF, 4
文件3:输出

A, AB,100,10
C,CC,300,30
awk-F,'BEGIN{OFS=,}FNR==NR{a[$1$2]=$3;next}$1$2在a&&$3=$3,a[$1$2]'文件2中文件1

测试如下:

> cat file1
A,AB,100
B,BB,200
C,CC,300
> cat file2
A,AB,10
C,CC,30
D,DF,4
> awk -F, 'BEGIN{OFS=","}FNR==NR{a[$1$2]=$3;next}($1$2 in a && $3=$3","a[$1$2])' file2 file1
A,AB,100,10
C,CC,300,30
> 
FNR==NR{a[$1$2]=$3;next}应用于第一个文件file2 它表示直到FNR==NR执行代码块。 FNR=当前文件的行号 NR=两个文件的总行数。 因此,在上面的语句之后,将创建一个索引为$1$2、值为$3的关联数组。 现在$1$2在a&&$3=$3,a[$1$2] 这是为FNR执行的=NR.where in检查索引$1$2是否作为数组中的索引存在,然后第二个条件是将file1的第三个字段更改为$3=$3,[$1$2],因此现在$0包含公共$1$2行,该行更改了其中的第三个字段。 对于四个文件也必须编写类似的逻辑。

awk-F,'BEGIN{OFS=,}FNR==NR{a[$1$2]=$3;next}$1$2在&&$3=$3,a[$1$2]'文件中为$2文件1

测试如下:

> cat file1
A,AB,100
B,BB,200
C,CC,300
> cat file2
A,AB,10
C,CC,30
D,DF,4
> awk -F, 'BEGIN{OFS=","}FNR==NR{a[$1$2]=$3;next}($1$2 in a && $3=$3","a[$1$2])' file2 file1
A,AB,100,10
C,CC,300,30
> 
FNR==NR{a[$1$2]=$3;next}应用于第一个文件file2 它表示直到FNR==NR执行代码块。 FNR=当前文件的行号 NR=两个文件的总行数。 因此,在上面的语句之后,将创建一个索引为$1$2、值为$3的关联数组。 现在$1$2在a&&$3=$3,a[$1$2] 这是为FNR执行的=NR.where in检查索引$1$2是否作为数组中的索引存在,然后第二个条件是将file1的第三个字段更改为$3=$3,[$1$2],因此现在$0包含公共$1$2行,该行更改了其中的第三个字段。 还必须为四个文件编写类似的逻辑。

尝试:

awk -F, '{i=$1 SUBSEP $2} NR==FNR{A[i]=$3; next} i in A{print $0,A[i]}' file2 file1
尝试:


为什么不只是diff file1 file2?我只需要file3匹配列H2CO3。请使用join命令。对于将来的读取器和@AmitNaidu,join命令是不够的,因为条件规定两列必须匹配。当然,可以先使用sed组合键列,然后在对新组合键列上的每个文件进行排序后,join就足够了,最终的sed过滤器可以再次分离连接的列。对于较大的文件,join可能会更有效,特别是如果它们已经在两列上排序。为什么不只是diff file1 file2?我需要file3只匹配H2CO3列。请使用join命令。对于将来的读取器和@AmitNaidu-join命令不足够,因为条件规定两列必须匹配。当然,可以先使用sed组合键列,然后在对新组合键列上的每个文件进行排序后,join就足够了,最终的sed过滤器可以再次分离连接的列。对于较大的文件,join可能更有效,尤其是如果它们已经在两列上进行了排序。sarathi非常感谢,它对我来说工作得很好,你能解释一下你在这里使用的逻辑吗?是否可以对四个文件应用相同的比较逻辑。这非常不习惯$如果在a&&$3=$3,a[$1$2]中写入$1$2,{$3=$3,a[$1$2];print}最好在索引中的字段之间使用分隔符。否则,如果字段长度不同,则一个字段的一部分可能会模糊到另一个字段,从而导致不可预测的结果。通常情况下,我们会使用subsp来实现这一点。或者在{print$3,a[$1$2]}中使用$1$2,因为OFS已经设置好了。不需要聪明或迷惑。根据需要更改数据文件的顺序。sarathi非常感谢,它对我来说工作正常,你能解释一下你在这里使用的逻辑吗?是否可以对四个文件应用相同的比较逻辑。这是非常不习惯的$如果在a&&$3=$3,a[$1$2]中写入$1$2,{$3=$3,a[$1$2];print}最好在索引中的字段之间使用分隔符。否则,如果字段长度不同,则一个字段的一部分可能会模糊到另一个字段,从而导致不可预测的结果。通常情况下,我们会使用subsp来实现这一点。或者在{print$3,a[$1$2]}中使用$1$2,因为OFS已经设置好了。不需要聪明或迷惑。根据需要更改数据文件的顺序。+1更好的答案。只需要字母S或逗号。减少对$variables的引用也可以提高性能。+1更好的答案。只需要字母S或逗号。减少对$variables的引用也可能是一个性能胜利。