繁体   English   中英

bash / awk脚本比较两个不同文件夹中所有文件的内容

[英]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

那是,

  • 不要使用“ ls”获取文件名列表
  • 只需要一个循环
  • 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM