对于包含两列数据(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
谢谢。
答案 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
以使输出漂亮。