Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.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
Bash 比较两个未排序的文件_Bash_Shell - Fatal编程技术网

Bash 比较两个未排序的文件

Bash 比较两个未排序的文件,bash,shell,Bash,Shell,我有两个选项卡分隔的文件(请参见下面的示例): 文件1 (等等) 文件2 现在,例如,如果说ALEX也在文件2中找到(不确定ALEX是否会找到),我应该有第三个文件,如下所示: PERL ALEX 3.4 代码应该检查文件2中文件1第2列中的所有值 对bash脚本有什么建议吗?使用PERL的一行程序也可以吗? 没有分类的作品。。 假设您的文件名为f1和f2 perl -e 'open(F1, shift); open(F2, shift); $ls = $/;undef $/;$f2 = &l

我有两个选项卡分隔的文件(请参见下面的示例):

文件1 (等等)

文件2 现在,例如,如果说ALEX也在文件2中找到(不确定ALEX是否会找到),我应该有第三个文件,如下所示:

PERL ALEX 3.4
代码应该检查文件2中文件1第2列中的所有值


对bash脚本有什么建议吗?

使用PERL的一行程序也可以吗? 没有分类的作品。。 假设您的文件名为f1和f2

perl -e 'open(F1, shift); open(F2, shift); $ls = $/;undef $/;$f2 = <F2>;$/ = $ls; while(<F1>) { ($t1, $t2) = $_ =~ /^(\w+)\s+(\w+)$/; if($t1) { ($t3) = $f2 =~ /^$t2\s+(.+)$/m; print "$t1 $t2 $t3 \n" if ($t3); } }' f1 f2
f2:

ALEX 3.4
SAM 8.9
PEPPER 9.0
结果:

PERL ALEX 3.4

您想使用
join
来实现这一点。首先,您需要根据联接字段进行排序,但:

join -1 2 -2 1 <(sort +1 -2 file1) <(sort +0 -1 file2)

join-12-21您使用join和awk获得了非常好的答案,因此我认为我发布的是一篇纯粹的bash文章:

#!/bin/bash

declare -A name2prog
declare -A name2num

while read a b; do name2prog[$b]=$a; done < file1
while read a b; do name2num[$a]=$b; done < file2

for i in "${!name2num[@]}"
do
    if  [[ ${name2prog[$i]} ]]; then
        echo ${name2prog[$i]} $i ${name2num[$i]}
    fi
done

“一行bash脚本”。。。比如说?这真的是一个好习惯吗?这一行看起来很难读。@YGomez:你应该用它,而不是读它。Perl是只写语言:)
PERL ALEX 3.4
join -1 2 -2 1 <(sort +1 -2 file1) <(sort +0 -1 file2)
awk 'NR==FNR {val[$1]=$2; next} $2 in val {print $0, val[$2]}' file2 file1
#!/bin/bash

declare -A name2prog
declare -A name2num

while read a b; do name2prog[$b]=$a; done < file1
while read a b; do name2num[$a]=$b; done < file2

for i in "${!name2num[@]}"
do
    if  [[ ${name2prog[$i]} ]]; then
        echo ${name2prog[$i]} $i ${name2num[$i]}
    fi
done
$ ./try.sh
PERL ALEX 3.4