Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何在shell脚本中显示两个文件之间不同的前五行?_Arrays_Linux_Shell_File_Ubuntu - Fatal编程技术网

Arrays 如何在shell脚本中显示两个文件之间不同的前五行?

Arrays 如何在shell脚本中显示两个文件之间不同的前五行?,arrays,linux,shell,file,ubuntu,Arrays,Linux,Shell,File,Ubuntu,我曾尝试使用2个数组来比较这2个文件,但我是新手,不知道如何做: vec_fis_1=`cat fisier.txt` vec_fis_2=`cat fisier1.txt` echo $vec_fis_2 echo $vec_fis_1 for i in ${vec_fis_1[@]} do for j in ${vec_fis_2[@]} do if ( "$i" == "$j" ) then

我曾尝试使用2个数组来比较这2个文件,但我是新手,不知道如何做:

vec_fis_1=`cat fisier.txt`
vec_fis_2=`cat fisier1.txt`
echo $vec_fis_2
echo $vec_fis_1
for i in ${vec_fis_1[@]}
do
        for j in ${vec_fis_2[@]}
        do
                if ( "$i" == "$j" )
                then
                        echo $i
                        echo $j
                fi
        done
done

你的问题不清楚你到底想要什么:

  • 两个文件是否需要5行不同的内容
  • 每个文件需要5行不同的内容吗
  • 下面的例子不是最新的解决方案,而是进一步思考的食物

    第一种情况的解决方案--仅取差异并打印前5行:

    comm -3 FILE1 FILE2 | head -n5
    
    第二种情况的解决方案——只取差异,从每个文件中打印5行不同的内容(总共10行):

    更新:

    上述示例是在假定
    FILE1
    FILE2
    都已排序的情况下提出的。如果未对它们进行排序,则需要对这两个示例进行增强,如下所示:

    comm -3 <( sort FILE1 ) <( sort FILE2 ) | ...
    

    comm-3不要使用反勾号`。改用
    $(..)

    因此,不要使用
    if(“$i”=“$j”)
    do
    if[“$i”!=“$j”]

    vec_fis_1
    vec_fis_2
    不是数组-
    ${vec_fis_1[@]}
    $vec_fis_1
    一样

    要将文件读入数组,请使用
    readarray

    要在读取循环时使用
    迭代文件中的行,请参阅

    而IFS=read-rl1;做
    而IFS=read-rl2;做
    如果[“$l1”!=“$l2”];然后
    printf“%s\n”$l1
    printf“%s\n”$l2
    fi
    完成
    我只需要具有相同“行索引”的行之间的差异

    所以同时从两个文件中读取

    while IFS= read -r -u3 l1 && 
             IFS= read -r -u4 l2; do
        if [ "$l1" != "$l2" ]; then
            printf "%s\n" "$l1"
            printf "%s\n" "$l2"
         fi
    done 3< fisier.txt 4< fisier1.txt
    
    当IFS=read-r-u3 l1&&
    IFS=读取-r-u4 l2;做
    如果[“$l1”!=“$l2”];然后
    printf“%s\n”$l1
    printf“%s\n”$l2
    fi
    完成3
    您也可以处理不同的行数。我有一个(相当详细的)想法:

    为true时;做
    IFS=读取-r-u3 l1
    l1valid=$?
    IFS=读取-r-u4 l2
    l2valid=$?
    如果((l1valid!=0 | | l2valid!=0));然后
    如果((l1valid!=0&&l2valid==0));然后
    echo“文件1比文件2长”
    elif((l1valid==0&&l2valid!=0));然后
    echo“文件1比文件2短”
    fi#l1有效!=0&&L2有效!=0-一切正常
    打破
    fi
    如果[“$l1”!=“$l2”];然后
    printf“%s\n”$l1
    printf“%s\n”$l2
    fi
    完成3
    或者说:

    while
        IFS= read -r -u3 l1
        l1valid=$?
        IFS= read -r -u4 l2
        l2valid=$?
        if ((l1valid != 0 && l2valid == 0)); then
           echo "file1 is longer then file2"
        elif ((l1valid == 0 && l2valid != 0)); then
           echo "file1 is shorter then file2"
        fi
        (( l1valid == 0 && l2valid == 0 ))
    do
        if [ "$l1" != "$l2" ]; then
            printf "%s\n" "$l1"
            printf "%s\n" "$l2"
         fi
    done 3< fisier.txt 4< fisier1.txt
    
    while
    IFS=读取-r-u3 l1
    l1valid=$?
    IFS=读取-r-u4 l2
    l2valid=$?
    如果((l1valid!=0&&l2valid==0));然后
    echo“文件1比文件2长”
    elif((l1valid==0&&l2valid!=0));然后
    echo“文件1比文件2短”
    fi
    ((l1valid==0&&l2valid==0))
    做
    如果[“$l1”!=“$l2”];然后
    printf“%s\n”$l1
    printf“%s\n”$l2
    fi
    完成3
    请注意,bash循环非常慢,使用awk时速度会快很多:

    awk -vother="fisier1.txt" '{ t=$0; getline < (other); if (t != $0) print $0 RS t }' fisier.txt
    
    awk-vother=“fisier1.txt”{t=$0;getline<(其他);如果(t!=$0)打印$0 RS t}'fisier.txt
    
    在上检查脚本。将
    diff
    head-n5
    一起使用。此命令显示两个文件的前5行,但我只需要不同文件的前5行。文件是否已排序?否。因此,最简单的方法可能是首先将两个文件排序为临时文件,然后将它们排序为
    diff
    ,正如@KamilCuk所暗示的那样。您需要将parms更改为
    diff
    ,或通过
    grep
    awk
    运行diff的输出,以允许使用
    diff
    命令生成各种信息行。这对我没有帮助,因为我的文件没有排序。它们每行都包含单词。我需要比较文件1的第1行和文件2的第1行,如果它们不同,那么我将显示文件1的第1行和文件2的第1行,如果它们相等,我将转到下一行。我应该这样做,直到我有5行显示。我已经更新了我的答案,而你的评论。请阅读答案的更新版本。更新只反映排序问题。但是我如何做,而不是第二个while,只是让if读取第二个文件中的行,因为我不需要所有差异,我只需要具有相同“行索引”的行之间的差异。文件1的第1行,文件2的第1行…文件1的第2行,文件2的第2行…等等?在这种情况下,每次从文件
    fisier.txt
    读取新行时,都会打开
    fisier.txt
    。将第一个文件中的每一行与第二个文件中的每一行进行比较。我不确定这是TS想要的。太酷了!您在纯shell中发明了一个轻量级的
    diff
    /
    comm
    工具。使用awk的方法非常有效!谢谢!但是你能解释一下为什么当我把你的代码放到shell中时,我会出现错误“syntax error near unexpected token`3'”?Arg太多空格。固定的。文件描述符编号和
    字符之间不需要空格。
    while true; do
    
        IFS= read -r -u3 l1
        l1valid=$?
        IFS= read -r -u4 l2
        l2valid=$?
        if ((l1valid != 0 || l2valid != 0)); then
            if ((l1valid != 0 && l2valid == 0)); then
               echo "file1 is longer then file2"
            elif ((l1valid == 0 && l2valid != 0)); then
               echo "file1 is shorter then file2"
            fi # l1valid != 0 && l2valid != 0 - all fine
            break;
        fi
    
        if [ "$l1" != "$l2" ]; then
            printf "%s\n" "$l1"
            printf "%s\n" "$l2"
         fi
    
    done 3< fisier.txt 4< fisier1.txt
    
    while
        IFS= read -r -u3 l1
        l1valid=$?
        IFS= read -r -u4 l2
        l2valid=$?
        if ((l1valid != 0 && l2valid == 0)); then
           echo "file1 is longer then file2"
        elif ((l1valid == 0 && l2valid != 0)); then
           echo "file1 is shorter then file2"
        fi
        (( l1valid == 0 && l2valid == 0 ))
    do
        if [ "$l1" != "$l2" ]; then
            printf "%s\n" "$l1"
            printf "%s\n" "$l2"
         fi
    done 3< fisier.txt 4< fisier1.txt
    
    awk -vother="fisier1.txt" '{ t=$0; getline < (other); if (t != $0) print $0 RS t }' fisier.txt