키 값을 기준으로 레이아웃이 다른 두 파일을 비교하고 출력을 세 번째 파일로 추출합니다.

키 값을 기준으로 레이아웃이 다른 두 파일을 비교하고 출력을 세 번째 파일로 추출합니다.

키 값을 기준으로 두 파일을 비교하고 파일 1에 일치하지 않는 레코드를 인쇄하고 싶습니다. 사용된 구분 기호는 파이프입니다.|

  • 출력은 다음과 같습니다
    I|234567|BCDE|234TFY|abc|12345
    
  • 파일 1:
    I|123456|ABCD|123abc|xyz|23456
    I|234567|BCDE|234TFY|abc|12345
    
    주요 열: 열 2 및 열 5
  • 파일 2:
    xyz|P|1001|123456
    bcd|P|1001|123467
    
    주요 열: 열 1 및 열 4

누구든지 올바른 접근 방식이 무엇인지 제안할 수 있습니까 awk?

답변1

이 작업을 수행하려면 다음 프로그램을 사용할 수 있습니다 awk.

awk -F'|' 'FNR==NR{key1[FNR]=$1;key2[FNR]=$4;next}
           {if ($2!=key2[FNR] || $5!=key1[FNR]) print}' file2.txt file1.txt 
  • 먼저 file2.txt각 행의 열 1과 4 목록을 구문 분석하고 작성합니다. 파일 FNR별 라인 카운터가 NR글로벌 라인 카운터(하지만 참고하세요비어 있으면 파괴됩니다 file2.txt! ).
  • 그런 다음 구문 분석할 때 file1.txt각 행에 대해 열 2와 5를 처리하는 동안 채워진 목록과 비교하고 file2.txt일치하지 않으면 행을 인쇄합니다.

답변2

다음과 같이 시도해 볼 수 있습니다.

while read -r line;
do
myvar2=$(line | awk '{ print $2}')
if grep -Fxq "$myvar" file2
then
# code if found
else
# code if not found
fi
myvar5=$(line | awk '{ print $5}')
if grep -Fxq "$myvar5" file2
then
# code if found
else
# code if not found
fi
done < file1

코드는 테스트되지 않았습니다. 이는 file1에서 한 줄씩 읽어야 하며, 열2로 구분되고, 열5로 구분되어야 awk '{ print $2 $5}'하며, 2와 5를 읽고 myvar가 file2에 있는지 확인해야 합니다.

관련 정보