[英]bash/awk script to compare the content all the files in two different folders
我在Linux服务器中有2个diff目录,其中来自两个diff服务器的.csv文件不断出现。 两个目录中文件的文件名相同。 我想要一个bash / awk脚本,该脚本从两个文件夹中选择一组相同的文件并读取其中的内容。 如果两个文件中的所有记录都相同,则应继续下一组文件,否则,如果任何记录中有差异,则应仅将该记录重定向到另一个文件名,例如$ filename_diff。 我是bash和awk的新手,经过大量尝试,我只能制作以下代码,这些代码根本没有运行:(
#!/bin/bash
for file1 in $(ls -rlt /var/opt/dir1/*.csv | awk '{ print $9 }')
do
for file2 in $(ls -lrt /var/opt/dir2/*.csv |awk '{ print $9 }')
do
if [["$file1" = "$file2"]]
then
awk 'BEGIN {FS==","} NR == FNR{arr[$0];next} ! ($0 in arr)' $file1 $file2 > /var/opt/diff/`echo "$file2"_diff`
else
echo "To NULL" > /dev/null
fi
done
done
请帮助提供解决方案。 提前非常感谢您。
我会做这样的事情:
#!/bin/sh
for file1 in /var/opt/dir1/*.csv
do
name1=$(basename "$file1")
file2="/var/opt/dir2/$name1"
[ -f "$file2" ] || continue
cmp -s "$file1" "$file2" && continue
diff "$file1" "$file2" | sed -e '/^[^>]/d' -e 's/^> //' >/var/opt/diff/"${name1}_diff`
done
那是,
diff
程序(如注释中所述)可以通过从默认输出中选择'>'行来提供所需的信息。 @init_js:-您建议的更改对我有用。 下面是工作脚本,
#!/bin/bash
for file1 in /var/opt/dir1/*.csv
do
file2=/var/opt/dir2/$(basename "$file1")
if [[ -e "$file2" ]]
then
awk 'BEGIN {FS==","} NR == FNR{arr[$0];next} ! ($0 in arr)' $file1 $file2 > /var/opt/diff/`echo $(basename "$file1")_diff`
fi
done
我不明白一件事,为什么“ file2”变量没有声明为file2 = $(/ var / opt / dir2 / $(basename“ $ file1”)); 因为通常我们只用$(command)声明变量,不是吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.