2012-03-30 31 views
2

這裏的問題是,有兩個文件:整蠱列repleacement從一個文件到另一個

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 

不過,這並不做工作,我有這種懷疑,它的方式更容易做..

謝謝!

回答

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 
+0

非常好,但它殺了製表符,文件bbb.txt是製表符分隔,並具有多列.. – user1302717 2012-03-30 08:45:49

+0

@ user1302717仍然快速和髒:管道輸出awk的線「欄目-t」 。所以它看起來像:awk ..... | column -t – Kent 2012-03-30 08:49:26

+0

非常感謝;]你R老闆;} – user1302717 2012-03-30 09:04:45

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 
0

這可能會爲你工作:(?GNU SED)

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

在本質上,轉換aaa.txtsed腳本看起來像這樣:

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| 

然後管這通過對運行對bbb.txt

0

這些指令第二sed程序順序很重要?如果不是怎麼樣

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