Bash에서 두 파일을 읽을 때 누락된 필드를 어떻게 정렬하고 채울 수 있습니까?

Bash에서 두 파일을 읽을 때 누락된 필드를 어떻게 정렬하고 채울 수 있습니까?

두 개의 텍스트 파일이 있습니다

CatA.txt

10,1,1,"ABC"
10,1,2,"S1"
10,1,2,"ABC"
10,1,3,"baba"
10,2,1,"S2"
10,2,1,"asd"
10,2,2,"S3"
10,2,2,"dkkd"
10,2,3,"ABC"

catB.txt

10,1,1,"ABC1"
10,1,2,"S1"
10,1,2,"ABC"
10,1,3,"baba"
10,2,1,"asd"
10,2,2,"S3"
10,2,2,"dkkd"
10,2,4,"bokaj"

두 개의 텍스트 파일을 읽어 누락된 필드를 찾고 ""로 두 파일을 누락된 필드로 채운 다음 두 개의 새로운 수정된 파일에 저장하고 싶습니다. 이 문을 어떻게 얻을 수 있습니까?

A1.txt는 A.txt의 수정된 버전입니다.

catA1.txt

10,1,1,"ABC"
10,1,2,"S1"
10,1,2,"ABC"
10,1,3,"baba"
10,2,1,"S2"
10,2,1,"asd"
10,2,2,"S3"
10,2,2,"dkkd"
10,2,3,"ABC"
10,2,4,"  "

B1.txt는 B.txt의 수정된 버전입니다.

catB1.txt

10,1,1,"ABC1"
10,1,2,"S1"
10,1,2,"ABC"
10,1,3,"baba"
10,2,1,"  "
10,2,1,"asd"
10,2,2,"S3"
10,2,2,"dkkd"
10,2,3,"  "
10,2,4,"bokaj"

A1.txt의 총 줄 수가 B1.txt의 줄 수와 동일한지 확인하십시오. 저는 bash를 처음 사용하므로 귀하의 답변과 설명이 이해하는 데 많은 도움이 될 수 있습니다.

지금까지 시도한 MWE는 다음과 같습니다.

#!/bin/bash


cut -d ',' -f1,2,3 A.txt > A1.txt
cut -d ',' -f1,2,3 B.txt > B1.txt


## Command to print contents which are in B1.txt but not in A1.txt

A=`awk 'NR==FNR{a[$0];next} !($0 in a)' A1.txt B1.txt`
echo $A,'" "' >> A.txt
sort A.txt

## Command to print contents which are in A1.txt but not in B1.txt

B=`awk 'NR==FNR{a[$0];next} !($0 in a)' B1.txt A1.txt`
echo $B,'" "' >> B.txt
sort B.txt

답변1

diff그렇다면 sort 여기서 유용하게 쓰일 수도 있겠네요 .

예제와 같이 A.txtB.txt파일과 해당 동반 항목 A1.txt 및 파일이 이미 설정되어 있는 경우 다음을 수행합니다.B1.txt

diff --unchanged-line-format= --old-line-format= --new-line-format='%l,"  "'%c\'\\12\' A1.txt B1.txt | sort -st , -k 1,3 A.txt -

그리고:

diff --unchanged-line-format= --old-line-format= --new-line-format='%l,"  "'%c\'\\12\' B1.txt A1.txt | sort -st , -k 1,3 B.txt -

그러면 설명하는 출력이 생성됩니다.

답변2

grep -vFf B.txt A.txt | sed 's/".*"/" "/' |  sort -st, -k1,3 - B.txt

결과(B1.txt):

10,1,1," "
10,1,1,"ABC1"
10,1,2,"S1"
10,1,2,"ABC"
10,1,3,"baba"
10,2,1," "
10,2,1,"asd"
10,2,2,"S3"
10,2,2,"dkkd"
10,2,3," "
10,2,4,"bokaj"

ABC첫 번째 줄은 귀하의 예 와 다르지만 ABC1.

관련 정보