如何使用另一个文件的每一行搜索文件并附加结果匹配的一个字段

时间:2013-01-10 00:05:11

标签: shell scripting

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

1232323 dog 
21321   cat
21321   fox
2312323 bird

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

dog red
cat blue
fox green
bird black

我正在尝试编写一个脚本,它将使用遍历file1第2列中每个条目的迭代来查找file2第1列的匹配条目,并创建第3个文件,将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 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

最干净的仅限bash的解决方案可能会使用关联数组,这需要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

答案 2 :(得分: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 $_";
        }
    }
}

答案 3 :(得分: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以使输出漂亮。