Arrays 如何在shell脚本中显示两个文件之间不同的前五行?
我曾尝试使用2个数组来比较这2个文件,但我是新手,不知道如何做: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
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
你的问题不清楚你到底想要什么:
comm -3 FILE1 FILE2 | head -n5
第二种情况的解决方案——只取差异,从每个文件中打印5行不同的内容(总共10行):
更新:
上述示例是在假定FILE1
和FILE2
都已排序的情况下提出的。如果未对它们进行排序,则需要对这两个示例进行增强,如下所示:
comm -3 <( sort FILE1 ) <( sort FILE2 ) | ...
comm-3不要使用反勾号`。改用$(..)
因此,不要使用if(“$i”=“$j”)
doif[“$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