패턴이 일치하면 다른 파일의 줄을 병합합니다.

패턴이 일치하면 다른 파일의 줄을 병합합니다.

입력: 탭으로 구분된 두 개의 파일 File1File2. File2( $2)는 File1( ) $1에 있는 패턴으로 구문 분석되어야 합니다.

예상 출력: 탭으로 구분된 파일인 . File3에는 . File3와 동일한 줄과 File2패턴이 일치하는 경우 해당 값 File1(줄 끝, 탭으로 구분)이 포함되어야 합니다.

파일 1(탭으로 구분):

ABC1    1    3
ABC2    4    3
ABC3    3    2
ABC4    3    3

파일 2(탭으로 구분):

text1   ABC1-AB   text2   text3
text2   ABC2-AB   text1   
text3   ABC1-CD   text2
text4   ABC5-AB   text3   text4

파일 3:

text1   ABC1-AB   text2   text3    1    3
text2   ABC2-AB   text1    4    3
text3   ABC1-CD   text2    1    3
text4   ABC5-AB   text3   text4

답변1

그리고 awk:

awk 'FNR==NR{a[$1]=$2"\t"$3} FNR!=NR{split($2,b,"-"); $0=$0"\t"a[b[1]];print}' file1 file2
  • FNR==NR첫 번째 파일의 경우 file1:
    • a[$1]=$2"\t"$3a두 번째와 세 번째 필드로 배열을 채우고 첫 번째 필드를 인덱스로 사용합니다.
  • FNR!=NR두 번째 파일의 경우 file2:
    • split($2,b,"-")에서 두 번째 필드를 분할합니다 -.
    • $0=$0"\t"a[b[1]]행에 두 개의 값을 추가합니다.
    • print이 줄을 인쇄하세요.

산출:

text1   ABC1-AB text2   text3   1   3
text2   ABC2-AB text1   4   3
text3   ABC1-CD text2   1   3
text4   ABC5-AB text3   text4

답변2

테스트에는 BASH를 사용하십시오.

while read LINEFILE2
do
  printf "$LINEFILE2" >> File3
  while read LINEFILE1
  do
    read PATTERN ADDITIONS <<EOF
$LINEFILE1
EOF
    [ ! -z "$PATTERN" ] && [ ! -z $(echo "$LINEFILE2" | cut -f2 | grep "$PATTERN") ] && {
      printf "\t$ADDITIONS\n" >> File3
    }
  done < File1
done < File2

열 2만이 아닌 전체 행 내부에서 패턴을 찾으려면 cut파이프 구조에서 명령을 가져올 수 있습니다.

관련 정보