从一个文件到另一个文件的棘手列替换

时间:2012-03-30 08:04:05

标签: bash sed awk

这是问题所在,有两个文件:

aaa.txt

1       abc
2       def  
3       ghi  
4       jkl  
5       xyz

bbb.txt

4       9  
3       2  
3       3  
4       9  
5       8  
2       6  
1       7

问题是如何用aaa.txt的第二列中的相应字符串替换文件bbb.txt的第一列? 输出应如下所示:

bbb.txt:

jkl       9  
ghi       2  
ghi       3  
jkl       9  
xyz       8  
def       6  
abc       7

我想出的是多次使用grep非常缓慢:

cat bbb.txt | awk '{print $1}' | while read k; 
do res=$(grep $k aaa.txt | awk '{print $2}'); 
echo $res >> out
done

但它根本不能完成这项工作,我怀疑它更容易做到......

谢谢!

4 个答案:

答案 0 :(得分:3)

击:

dict=()
while read key value; do
  dict[$key]=$value
done < aaa.txt

while read key text; do
  echo "${dict[$key]} $text"
done < bbb.txt

答案 1 :(得分:2)

快速而肮脏:

kent$  awk 'NR==FNR{a[$1]=$2;next;}$1=a[$1]' aaa.txt bbb.txt 
jkl 9
ghi 2
ghi 3
jkl 9
xyz 8
def 6
abc 7

答案 2 :(得分:0)

这可能适合你:( GNU sed?)

sed 's/^\(\S*\)\s*\(\S*\).*/s|^\1\\>|\2|/' aaa.txt | sed -i -f - bbb.txt

实质上,将aaa.txt转换为sed脚本,如下所示:

sed 's/^\(\S*\)\s*\(\S*\).*/s|^\1\\>|\2|/' aaa.txt                   
s|^1\>|abc|
s|^2\>|def|
s|^3\>|ghi|
s|^4\>|jkl|
s|^5\>|xyz|

然后将其传递给第二个sed程序,该程序针对bbb.txt运行这些说明

答案 3 :(得分:0)

订单重要吗?如果没有怎么样

join -t $'\t' <(sort -n aaa.txt) <(sort -n bbb.txt) | cut -d$'\t' -f2-