0

对于具有两列数据的文件 (file1),如下所示:

1232323 dog 
21321   cat
21321   fox
2312323 bird

第二个文件包含两列数据(file2),如下所示:

dog red
cat blue
fox green
bird black

我正在尝试编写一个脚本,该脚本将使用遍历 file1 的第 2 列中的每个条目以从 file2 的第 1 列中查找匹配的条目,并创建第三个文件,将 file2 的第 2 列中的数据附加到具有“像这样打”:

1232323 dog red
21321   cat blue
21321   fox green
2312323 bird black

这是一些伪代码:

For each string in field 2 of file1
    grep file2
    output field1 and field2 of file1 and matching field2 of file2 from any hits to file3

谢谢你。

4

4 回答 4

0

最干净的 bash-only 解决方案可能会使用关联数组,这需要 bash > 4:

#!/usr/bin/env bash

declare -A num_data
while read -r num animal; do
    num_data["$animal"]="$num"
done < file1

declare -A color_data
while read -r animal color; do
    color_data["$animal"]="$color"
done < file2

for i in "${!num_data[@]}"; do
    printf '%s %s %s\n' "${num_data[$i]}" "$i" "${color_data[$i]}"
done
于 2013-01-10T00:28:38.937 回答
0

这个单线可能会有所帮助:

kent$  awk 'NR==FNR{a[$2]=$0;next}$1 in a{print a[$1],$2}' f1 f2
1232323 dog  red
21321   cat blue
21321   fox green
2312323 bird black

或加入:

kent$  join -12 -21 -o 1.1 1.2 2.2 f1 f2
1232323 dog red
21321 cat blue
21321 fox green
2312323 bird black
于 2013-01-10T00:27:29.353 回答
0

这是一个 Perl 解决方案:

# Usage:  perl datafind.pl > file3.txt

open FILE1, "<file1.txt" or die $!;
my @lines1 = <FILE1>;
close FILE1 or die $!;

open FILE2, "<file2.txt" or die $!;
my @lines2 = <FILE2>;
close FILE2 or die $!;

foreach(@lines1) {
    my($col11, $col12) = split(/\s+/);
    foreach(@lines2) {
        my($col21, $col22) = split(/\s+/);
        if($col12 eq $col21) {
            print "$col11 $_";
        }
    }
}
于 2013-01-10T00:41:45.383 回答
0

join命令是您需要的,但需要对输入文件进行排序。使用进程替换:

join -1 2 -o 1.1,1.2,2.2 <(sort -b -k2 file1) <(sort file2)

生产

2312323  bird  black
21321    cat   blue
1232323  dog   red
21321    fox   green

我通过管道将 join 命令输入column -t以使输出漂亮。

于 2013-01-10T01:12:33.163 回答