Хитрая перестановка столбцов из одного файла в другой - PullRequest
2 голосов
/ 30 марта 2012

вот проблема, есть два файла:

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

Вопрос в том, как заменить первый столбец файла bbb.txt соответствующими строками из второго столбца aaa.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 ]

3 голосов
/ 30 марта 2012

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
2 голосов
/ 30 марта 2012

быстро и грязно:

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 голосов
/ 30 марта 2012

Важен ли порядок?Если нет, то как насчет

join -t $'\t' <(sort -n aaa.txt) <(sort -n bbb.txt) | cut -d$'\t' -f2-
0 голосов
/ 30 марта 2012

Это может работать для вас: (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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...