![두 파일을 비교하고 빈 줄을 인쇄하여 일치하지 않는 파일을 찾으시겠습니까?](https://linux55.com/image/135138/%EB%91%90%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EB%B9%84%EA%B5%90%ED%95%98%EA%B3%A0%20%EB%B9%88%20%EC%A4%84%EC%9D%84%20%EC%9D%B8%EC%87%84%ED%95%98%EC%97%AC%20%EC%9D%BC%EC%B9%98%ED%95%98%EC%A7%80%20%EC%95%8A%EB%8A%94%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EC%B0%BE%EC%9C%BC%EC%8B%9C%EA%B2%A0%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
두 파일을 일치시키고 일치하는 결과를 인쇄하려고 합니다. "숫자" 열 3을 기준으로 일치하지 않는 결과에 대해 빈 행을 남겨 둡니다. 여기서 아이디어는 두 파일을 같은 길이로 만드는 것입니다.
예: 파일 1
BMW 111 N1
BENZ 123 N2
TOYOTA 122 N3
파일 2
N1
N23
N3
결과:
BMW 111 N1
*blank line (N23 does not exit in file 1*
TOYOTA 122 N3
이 두 파일을 일치시키기 위해 AWK를 사용하고 있지만 삽입할 수 없습니다.빈 줄
awk 'NR==FNR{a[$1];next}$3 in a{print $1,$2,$3}' file2.txt file1.txt > result.txt
좋다https://stackoverflow.com/questions/977408/how-do-i-insert-a-blank-line-every-n-lines-using-awk
답변1
대신에 $3 in a{print $1,$2,$3}
시도해 보세요 !($3 in a){$0 = ""} 1
.
답변2
for line in $(cat file2);
do
grep $line file1 || echo "";
done
다음 출력을 생성합니다
$ for line in $(cat file2); do grep $line file1 || echo ""; done
BMW 111 N1
TOYOTA 122 N3
$
답변3
두 파일이 모두 조인 필드에 정렬되어 있다고 가정합니다.
$ join -1 3 -a 2 -o1.1,1.3,1.3 file1 file2
BMW N1 N1
TOYOTA N3 N3
file1
-1 3
세 번째 열과 첫 번째(유일한) 열을 사용하여 두 파일에 대해 관계형 JOIN 작업을 수행 합니다 file2
. 짝이 없는 행을 포함하여 file2
출력에 포함된 모든 행(포함)을 요청합니다 -a 2
. 출력을 위해 첫 번째 파일의 세 필드가 모두 인쇄되도록 요청합니다( flags 사용 -o
). 일치하지 않는 줄의 빈 필드는 비어 있는 상태로 유지되지만 -e something
문자열을 추가하여 채울 수 있습니다 something
.
파일이 2개라면아니요조인 필드를 정렬하려면 다음을 사용하여 미리 정렬할 수 있습니다.
sort -k3 -o file1 file1
sort -o file2 file2
또는 쉘이 프로세스 대체를 지원하는 경우 연결하는 동안 다음을 사용하여 정렬할 수 있습니다.
join -1 3 -a 2 -o1.1,1.3,1.3 \
<( sort -k3 file1 ) \
<( sort file2 )
답변4
paste file1.txt file2.txt | sed -Ee 's/\s(\S+)\s+\1\s*$/ \1/;t' -e g
그러면 파일의 내용이 각 줄에 나란히 인쇄되고 Gnu sed가 이 줄에서 작동하게 됩니다.
파일의 마지막 필드가 일치하면 해당 줄에서 해당 필드를 제거하고 인쇄합니다. 그렇지 않으면 빈 저장 공간에서 검색된 빈 줄을 인쇄합니다.
또 다른 방법은 다음과 같습니다.
paste a.txt b.txt | awk '{NF -= $(NF) == $(NF-1) ? 1 : NF}1'