如何使用shell脚本比较两个文件,一个有不同的字段,另一个是c文件?

如何使用shell脚本比较两个文件,一个有不同的字段,另一个是c文件?,c,linux,bash,shell,awk,C,Linux,Bash,Shell,Awk,我有以下两个文件: 文件1: #include<stdio.h> printf,scanf #include<string.h> strcpy,strcat,strlen #include<time.h> time 我们必须在file2中搜索file1 field2的函数。如果它们存在,那么我们应该将结果写入另一个名为output的文件。它应该只包含文件名,相应的头文件应该像 File2:headerfile1,headerfile2 使用gr

我有以下两个文件:

文件1:

#include<stdio.h>   printf,scanf
#include<string.h>  strcpy,strcat,strlen
#include<time.h>    time
我们必须在file2中搜索file1 field2的函数。如果它们存在,那么我们应该将结果写入另一个名为output的文件。它应该只包含文件名,相应的头文件应该像

File2:headerfile1,headerfile2

使用grep和awk是否可以做到这一点?

您可以将file1转换为模式列表,每行一个,并将其用作

grep -f patterns file2

使用以下脚本

#!/bin/sh
HEAD=
while read p; do
    i=1;
    for word in $p;do
        if [ "$i" = "1" ];then
            HEAD=$word
            echo "header = $HEAD"
        else
            FOUND=0
            for j in $(echo "$word" | tr "," "\n");do
                if grep -Fq "$j" file2.c
                then
                    FOUND=1
                fi
                if ["$FOUND" = "1" ];then
                    #write it into your c file; I am skipping that code
                fi
            done
        fi
        i=0
    done
done < file1

跳过第一个单词,并用逗号分隔的行进行编辑。对于每一条不可能接近或甚至不在正确方向的线,都要这样做。@Ed Morton 2怎么会这样?我很确定这是可以做到的。一个小例子:grep怎么能知道单词time是出现在字符串char*foo=这个时间还是下一个我们增加I;或者评论/*我们不使用时间,因为…*/vs作为函数调用时间?如果没有该语言的解析器,就无法完成此操作,而且该解析器甚至必须知道它正在解析的语言版本,才能知道构造的含义,例如://在K&R C中的含义与C99中的含义不同。@EdMorton承认,grepping与解析不同,但OP正在寻找一个简单的解决方案,可能是家庭作业。你的意思不太清楚。请试着给出一个答案,并附上您尝试过的内容以及您需要的确切输出。不,没有C解析器,不可能可靠地完成这项工作。例如,在不解析语言的情况下,任何文本处理工具都无法可靠地判断函数名是否实际显示为函数调用,而不是作为字符串或注释的一部分。例如,如果printf格式化字符串是printfIt打印字符串长度str1:%d,strlenstr1;的时间,则不应找到时间;。您需要使用或类似的方法从C代码中查找函数调用,然后您可以编写一个工具,将这些调用映射到File1中的列表。这将无法接近,甚至无法正确地解决此问题。另外,请参见。
#!/bin/sh
HEAD=
while read p; do
    i=1;
    for word in $p;do
        if [ "$i" = "1" ];then
            HEAD=$word
            echo "header = $HEAD"
        else
            FOUND=0
            for j in $(echo "$word" | tr "," "\n");do
                if grep -Fq "$j" file2.c
                then
                    FOUND=1
                fi
                if ["$FOUND" = "1" ];then
                    #write it into your c file; I am skipping that code
                fi
            done
        fi
        i=0
    done
done < file1