2015-11-23 43 views
0

我在Linux服务器中有两个diff目录,其中来自两个diff服务器的.csv文件不断出现。两个目录中的文件的文件名是相同的。 我想要一个bash/awk脚本,它从两个文件夹中选取一组相同的文件并读取它们中的内容。 如果两个文件中的所有记录都是相同的,它应该继续下一组文件,否则如果任何记录有差异,它应该只将该记录重定向到另一个文件名称$ filename_diff。 我的bash和awk的一个新的学习和大量的尝试后,我才能够使下面的代码这是不是运行在所有:(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 

提供了一个解决这个请大家帮忙。 非常感谢你提前

+1

在一些地方错了。在/var/opt/dir1/*.csv中的第一个for循环中使用简单的glob扩展for file1;做...完成“。如果它们具有相同的基本名称,则只比较文件,因此根据第一个文件:file2 =/var/opt/dir2/$(basename“$ file1”)来构建第二个文件名。你用'[[''使用'==',而不是'='(''''用'/ bin/[')'来比较两个字符串。并且你想确保'$ file2'存在:'if [[-e“$ file2”]];'你不用'/ usr/bin/diff'来比较内容吗? –

+2

你真的想达到什么目的? (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)如果你想比较两个目录的内容,为什么'diff --recursive dir1 dir2'不够? –

+0

嗨Micha,谢谢你的回复......我不能使用diff,因为尽管它会显示不同的文件,但不会告诉哪个特定的记录在该文件中不同(因为我在一个文件中有数千条记录),也是不同记录的重定向是一个挑战... 嘿init_js,谢谢你的回复以及...请让我检查和制定你的建议脚本。我会尽快回复您。 – user5419230

回答

0

我会做这样的事情:

#!/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程序(如在评论中所指出)给由它的默认输出选择“>”线所需要的信息。
  • 为输出文件名给出的路径名看起来不正确(我删除了不需要的目录部分)。
0

@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 

我不明白一两件事,为什么 “文件2” 变量没有被宣布为文件2 = $(在/ var /选择/ DIR2/$(名前缀 “$文件1”));因为通常我们只用$(command)声明变量,不是吗?

相关问题