我是 awk 和 shell 的新手,想知道如何使用 shell/awk 将 2 个文件与具有相同记录的行合并? file1 和 file2 的名称顺序可能不同。我只想合并具有相同记录的行。请帮忙。
file1.txt
Mary 68
Tom 50
Jason 45
Lu 66
file2.txt
Jason 37
Tom 26
Mary 74
Tina 80
mergefile.txt
Marry 68 74
Tom 50 26
Jason 45 37
我尝试了 awk,但运行脚本需要一些时间。想知道是否有更快、更简单的工具。
cat file1.txt | while read line
do
score1=$( echo $line | awk '{print $2}');
name1=$( echo $line | awk '{print $1}');
cat file2.txt | while read l
do
score2=$( echo $l | awk '{print $2}');
name2=$( echo $l | awk '{print $1}');
if [[ $name1 == $name2 ]]
then
echo "$name1 $score1 $score2" >> mergefile
break
fi
done
done
答案1
如果你想使用 awk:
$ awk 'NR==FNR {a[$1] = $2; next} $1 in a {print $1, $2, a[$1]}' file2.txt file1.txt
Mary 68 74
Tom 50 26
Jason 45 37
不需要排序,输出将按照给定的第二个文件的顺序排列。
解释:
NR==FNR
是从第一个命名文件中选择记录的规范方法{a[$1] = $2; next}
使用第一个字段中的键和第二个字段中的值填充数组$1 in a
如果第一个字段已在第一个文件中看到;然后{print $1, $2, a[$1]}
打印第二个文件中的键和值以及第一个文件中的值
答案2
这听起来像是一份工作join
,关系数据库运算符
join <(sort file1.txt) <(sort file2.txt)
测试
$ cat file1.txt
Mary 68
Tom 50
Jason 45
Lu 66
$ cat file2.txt
Jason 37
Tom 26
Mary 74
Tina 80
$ join <(sort file1.txt) <(sort file2.txt)
Jason 45 37
Mary 68 74
Tom 50 26
join
是 POSIX 中指定的标准工具。
手册join
页指出:
The files file1 and file2 shall be ordered in the collating sequence of sort -b on the fields on which they shall be joined, by default the first in each line. All selected output shall be written in the same collating sequence.