2012-07-10 2 views
1

에 다른 파일의 열의 한 부분으로 파일의 특정 컬럼을 교체 도움이 필요내가 두 개의 입력 파일이 유닉스

을 File1로 :

ABC:client1:project1 
XYZ:client2-aa:project2 
DEF:client4:proj 

있는 File2 :

client1:W-170:xx 
client2-aa:WT-04:yy 
client4:L-005A:zz 

또한 유효한 값 배열은 [W, WT]와 같이 하드 코드 될 수 있습니다.

출력 :

ABC:W:project1 
XYZ:WT:project2 

기본적으로 file1의 column2가 file2의 레코드 1의 column1과 일치하면 file1의 coulmn2를 file2의 column2 부분으로 바꿉니다. 이 부분을 얻으려면 "-"연산자를 사용하여 file2의 column2를 분할하고 결과를 배열과 일치시켜 유효한 값을 결정해야합니다.

위의 기준과 일치하지 않는 레코드의 경우 출력에 표시하면 안됩니다.

쉘 스크립팅에 익숙하지 않으므로 도움이됩니다. 나는 며칠부터 노력하고 그러나

awk -F":" 'NR==FNR{A[$1]=$2;next}$2 in A{$2=A[$2]}1' OFS=":" file2 file1. 

사용하여 전체 열을 대체 할 수 있었다 , 열 요구 사항 작업의 일부를 얻을 수 없었다.

답변

2

아주 가까이 있습니다.

awk ' 
    BEGIN { OFS=FS=":" } 
    NR==FNR { split ($2,one,"-"); two[$1] = one[1]; next } 
    $2 in two { $2 = two[$2]; print } 
' file2 file1 

출력 :

ABC:W:project1 
XYZ:WT:project2 
DEF:L:proj 
0

이 당신 (GNU이 나오지도)을 위해 일 수 있습니다

sed 's/^\([^:]*:\)\([^-]*\).*/s|:\1|:\2:|p/' file2 | sed -nf - file1 

설명 여기 split 기능을 사용하여 당신이 찾고있는 awk 코드입니다 :

  • sed 's/^\([^:]*:\)\([^-]*\).*/s|:\1|:\2:|p/' file2 대체 할 sed 스크립트를 만드십시오. 구성 파일에 대해
  • sed -nf - file1 다른 sed 인스턴스에 파이프를 통해 실행

N.B. 나는 이것이 귀하의 필요에 완전히 부합하지 않을 수도 있으므로 "Also, array of valid values can be hardcoded like [W,WT]"을 이해하지 못합니다.

관련 문제