2012-09-05 6 views
1

bash/sed를 사용하여 일치하는 문자열을 검색하려고합니다. 일치하는 문자열이 발견되면 해당 변수의 끝에 해당 변수를 추가합니다.특정 줄에 일치하는 문자열 추가 (sed/bash)

두리스트 : 나는 그것을 실행할 때

[linuxbox tmp]$ cat lista 
a 23 
c 4 
e 55 
b 2 
f 44 
d 74 
[linuxbox tmp]$ cat listb 
a 3 
e 34 
c 84 
b 1 
f 500 
d 666666 

#!/bin/bash 
rm -rf listc 

cat listb |while read rec 
do 
    var1="$(echo $rec | awk '{ print $1 }')" 
    var2="$(echo $rec | awk '{ print $2 }')" 
    if egrep "^$var1" lista; then 
      sed "/^$var1/ s/$/ $var2/1" lista >> listc 
    fi 
done 

내가 얻을 :

[linuxbox tmp]$ ./blah.sh 
a 23 
e 55 
c 4 
b 2 
f 44 
d 74 

[linuxbox tmp]$ cat listc 
a 23 3 
c 4 
e 55 
b 2 
f 44 
d 74 
a 23 
c 4 
e 55 34 
b 2 
f 44 
d 74 
a 23 
c 4 84 
e 55 
b 2 
f 44 
d 74 
a 23 
c 4 
e 55 
b 2 1 
f 44 
d 74 
a 23 
c 4 
e 55 
b 2 
f 44 500 
d 74 
a 23 
c 4 
e 55 
b 2 
f 44 
d 74 666666 

난에 도착하기 위해 노력하고있어 출력은 다음과 같습니다

a 23 3 
e 55 34 
c 4 84 
b 2 1 
f 44 500 
d 74 666666 

내가 뭐하는 거지 여기서 뭐라구? 이 작업을 수행하는 더 좋은 방법이 있습니까?

미리 감사드립니다.

+0

'-n'과 함께'sed'를 사용하고'p'를 대체 명령에 추가하십시오. – Thor

답변

1

당신은 정렬 된 출력을 점점 마음을하지 않는 경우 : 입력 파일을 기반으로

join <(sort lista) <(sort listb) 
+0

모두 문제없이 작동합니다. 그러나 이것은 가장 간결합니다. 고맙습니다. – user1117603

0

awk 사용 방법 :

awk 'FNR==NR { array[$1]=$2; next } { if ($1 in array) print $1, array[$1], $2 }' lista listb 

결과 :

a 23 3 
e 55 34 
c 4 84 
b 2 1 
f 44 500 
d 74 666666 
0

(NO 하나의 파일에 중복 키), 다음 트릭을 수행합니다 :

>> for key in $(awk '{print $1}' lista) ; do 
+> echo $key $(awk -vK=$key '$1==K{$1="";print}' lista listb) 
+> done 

a 23 3 
c 4 84 
e 55 34 
b 2 1 
f 44 500 
d 74 666666