这是问题所在,有两个文件:
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
但它根本不能完成这项工作,我怀疑它更容易做到......
谢谢!
答案 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-