Linux 比较shell脚本中两个不同文件中的两列
有一个文件1,如下所示:Linux 比较shell脚本中两个不同文件中的两列,linux,bash,shell,Linux,Bash,Shell,有一个文件1,如下所示: 21,2018042100 22,2018042101 87,2018042102 98,2018042103 文件2如下所示: 45,2018042100 86,2018042102 87,2018042103 我需要的是:文件3 2018042100,21,45 2018042101,22,0 2018042102,87,86 2018042103,98,87 在文件3的第2行
21,2018042100
22,2018042101
87,2018042102
98,2018042103
文件2如下所示:
45,2018042100
86,2018042102
87,2018042103
我需要的是:文件3
2018042100,21,45
2018042101,22,0
2018042102,87,86
2018042103,98,87
在文件3的第2行中,2018042101的数据存在于文件1中,但不存在于文件2中。因此,0被插入到属于文件2的列$3中
请帮助我了解如何创建像file3这样的文件。
谢谢。Join似乎是为解决这个问题而设计的:
join -t',' -a 1 -a 2 -j 2 file1 file2
2018042100,21,45
2018042101,22
2018042102,87,86
2018042103,98,87
除了第2行中缺少的0之外,您也可以在手册页中找到解决该问题的方法。否则,您可以使用sed纠正该问题
join -t',' -a 1 -a 2 -e "0" -j 2 file1 file2 | sed -r 's/^[^,]+,[^,]+$/&,0/'
2018042100,21,45
2018042101,22,0
2018042102,87,86
2018042103,98,87
另一种使用awk的方法是:
$ awk 'BEGIN{FS=OFS=","}NR==FNR{a[$2]=$1;next}{print $2,$1,(a[$2]+0)}' file2 file1
2018042100,21,45
2018042101,22,0
2018042102,87,86
2018042103,98,87
解释:
$ awk '
BEGIN {
FS=OFS="," # set field separators
}
NR==FNR { # process first file
a[$2]=$1 # hash value on date
next # process next record in first file
}
{ # process second file
print $2,$1,(a[$2]+0) # output date, value, value from first file if exists
}' file2 file1 # mind the file order
请注意,[$2]+0期望第一个字段值是一个与示例中类似的数字。所有其他值都将产生0。目标是在问题中添加一些自己的代码,以至少显示您自己为解决此问题所做的研究工作。我建议查看awk。堆栈溢出不是一种代码编写服务。请出示你的密码。因为堆栈溢出对您隐藏了关闭的原因:寻求调试帮助的问题为什么这段代码不起作用?必须包括所需的行为、特定的问题或错误以及在问题本身中重现这些问题所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:。