awk는 두 파일의 내용을 필터링하는 데 사용됩니다.

awk는 두 파일의 내용을 필터링하는 데 사용됩니다.
$ file1.txt    
12345,865221,APPLE,ZZ,QQ,DD,GG,APPLE-FRUIT
12346,865222,MANGO,ZZ,QQ,DD,GG,MANGO-FRUIT
12347,865222,GRAPE,ZZ,QQ,DD,GG,GRAPE-FRUIT

$file2.txt
APPLE-FRUIT,10KG
MANGO-FRUIT,12KG

위에서 언급한 두 개의 파일이 있습니다. 아래와 같이 새 파일을 만들어야 합니다.

$Output
12345,865221,APPLE,ZZ,QQ,DD,GG,APPLE-FRUIT,10KG
12346,865222,MANGO,ZZ,QQ,DD,GG,MANGO-FRUIT,12KG
12347,865222,GRAPE,ZZ,QQ,DD,GG,GRAPE-FRUIT

내가 알아낸 한 가지 방법은 while 루프를 사용하는 것입니다. file2의 각 행을 읽고 첫 번째 열을 file1의 열 8과 비교했습니다. 이렇게 하면 원하는 출력을 얻을 수 있습니다. 동일한 목적을 달성하기 위해 간단한 awk 명령을 찾고 있습니다.

답변1

사용 join:

join -t, -a 1 -1 8 -2 1 file1.txt file2.txt

사용 awk:

첫 번째 파일의 내용을 해당 인덱스로 입력하여 배열에 저장하고 두 번째 파일을 처리할 때 호출합니다.

awk -F "," '
    FILENAME=="file1.txt"{row[$8]=$0}
    FILENAME=="file2.txt"{OFS=","; print row[$1],$2}
' file*.txt

새로운 요구사항의 경우:

awk -F "," '
    FILENAME=="file1.txt"{row[$8]=$0}
    FILENAME=="file2.txt"{row[$1]=row[$1]","$2}
    END{ for (i in row) print row[i] }
' file*.txt

이 됩니다.정렬 변경.


사용 csvsql:

이것도 활용도가 좋은데요csvsql, 특히 텍스트 필드에 따옴표가 포함되어 있고 구분 기호가 따옴표 안에 있으면 위의 해결 방법이 실패합니다.

csvsql -H \
  --query  "select file1.*, file2.b from file1 left join file2 on file1.h == file2.a" \
  file*.txt

답변2

먼저 작은 파일을 반복합니다.

awk -F, -v OFS=, '
    NR == FNR    { weight[$1] = $2; next }
    $8 in weight { $(NF+1) = weight[$8] }
    1
' file2.txt file1.txt

관련 정보