한 파일의 열을 다른 파일의 다른 열로 검색

한 파일의 열을 다른 파일의 다른 열로 검색

열이 다른 두 개의 파일이 있습니다.

File1:

pears   are fruits
apple   is  fruit
carrot  is  veg
celery  is  vegetable
oranges are fruits

File2:

fruits apple   mycode is #q123c# for apple
fruits pears   my code is #q432c# for juicy
veg    celery  my code value is #q989c# for vegetables
veg    spinach code is #q783c# and is a type of vegetable
fruits papaya  i have code #q346c#
vegie  lettuce code #q445c# is vege

이상적인 출력 파일이 필요합니다:

Q432C pears fruits
Q123C apple fruit
Q---C carrot veg
Q989C celery vegetable
Q---C oranges fruits

File1의 열 1은 File1의 열 2와 비교되어야 합니다 File2. 일치하는 것이 있으면 두 개의 # 필드 내에 q-to-c 코드를 인쇄하고 File2, 그렇지 않으면 빈 코드를 인쇄합니다 q---c. QC 코드를 대문자로 변환합니다.

나는 출력이 File1.

이상적으로는 출력 파일에 q-to-c 코드가 포함된 다음 File2이를 추가해야 합니다. 그러나 지금은 일치하는 줄에서 q-to-c 코드를 제거하고 대문자로 만드는 File1방법을 알아냈습니다 .File2

awk 'NR==FNR { a[$1]=1; next } ($2 in a) {print $0} ' File1 File2 | sed -e 's/.*#\(.*\)#.*/\1/' | tr [a-z] [A-Z] > outputFile

...누구 도와줄 수 있나요? 저는 awk스크립팅이 처음입니다.

위의 결과를 얻은 후 연결하려고 했지만 생성한 출력 파일에 I 의 줄 수가 없기 때문에 올바른 q-to-c 코드를 올바른 줄에 연결하지 못할 위험이 있습니다 File1.
다른 솔루션을 나누는 것을 기꺼이 받아들입니다 awk.

누구든지 도울 수 있다면 매우 감사하겠습니다. :)
미리 감사드립니다.

답변1

싱글로awk주문하다:

awk 'NR == FNR{
         match($0, /#q[0-9]{3}c#/);
         fruits[$2] = substr($0, RSTART + 1, RLENGTH - 2);
         next
     }
     { print ($1 in fruits? toupper(fruits[$1]) : "Q---C"), $1, $3 }' file2 file1

산출:

Q432C pears fruits
Q123C apple fruit
Q---C carrot veg
Q989C celery vegetable
Q---C oranges fruits

관련 정보