2012-03-30 19 views
2

hier ist das Problem, gibt es zwei Dateien:Tricky Spalte repleacement von einer Datei in einer anderen

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

Die Frage ist, wie man die erste Spalte der Datei bbb.txt durch die entsprechenden Strings aus der zweiten Spalte von aaa.txt ersetzt? Ausgabe sollte wie folgt aussehen:

bbb.txt:

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

Was ich komme mit bereits oben ist sehr langsam mehrere grep Verwendung:

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

Aber es tut nicht das Job überhaupt und ich habe diesen Verdacht, dass es einfacher ist, zu tun ..

Vielen Dank!

Antwort

2

quick and dirty:

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

Sehr gut, aber es töten Tabulatoren, Datei bbb.txt ist Tabula begrenzt und mehrere Spalten hat .. – user1302717

+0

@ user1302717 noch quick & dirty: Rohr der Ausgang der awk-Leitung auf „Spalte -t“ . So sieht es aus: awk ..... | Spalte -t ​​ – Kent

+0

Vielen Dank;] Sie R der Chef;} – user1302717

3

Bash:

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

Dies könnte für Sie arbeiten: (GNU sed)

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

Im Wesentlichen wandeln die aaa.txt in ein sed Skript, das so aussieht:

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| 

Dann Rohr dies durch zu einem zweiten sed Programm, das diese Anweisungen läuft gegen bbb.txt

0

ist wichtig, um? Wenn nicht, wie etwa

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