두 개의 텍스트 파일이 있습니다
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.txt
및 B.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
.