유닉스에서 두 개의 다른 파일을 한 줄씩 비교하는 방법은 무엇입니까?

유닉스에서 두 개의 다른 파일을 한 줄씩 비교하는 방법은 무엇입니까?

파일 1:

123
234
345
456

파일 2:

123
234
343
758

예상 출력: 파일 3:

TRUE
TRUE
FALSE
FALSE

따라서 코드는 두 파일을 비교하여 일치하면 "TRUE"를 인쇄해야 하고, 그렇지 않으면 새 파일에서 "FALSE"를 인쇄해야 합니다. 누구든지 이에 대한 해결책을 제공할 수 있습니까?

답변1

또는 기타 지원되는 쉘에서 diff다음 명령을 사용하십시오.bash<(...) 프로세스 교체또는다음과 같이 흉내낼 수 있습니다.:

diff --new-line-format='FALSE'$'\n' \
     --old-line-format='' \
     --unchanged-line-format='TRUE'$'\n' \
<(nl file1) <(nl file2)

출력은 다음과 같습니다:

TRUE
TRUE
FALSE
FALSE

--new-line-format='FALSE'$'\n', 인쇄FALSE행이 다르고 --old-line-format=''file1의 행이 다르면 출력을 비활성화하는 경우 이를 호출합니다.오래된파일을 diff 명령으로 전환할 수도 있습니다. 즉, 하나는 인쇄 FALSE하고 다른 하나는 비활성화해야 함을 의미합니다.

--unchanged-line-format='TRUE'$'\n', 인쇄TRUE라인이 동일한 경우. C $'\n'스타일 이스케이프 구문은 각 출력 줄 뒤에 새 줄을 인쇄하는 데 사용됩니다.

답변2

파일에 탭 문자가 포함되어 있지 않다고 가정합니다.

$ paste file1 file2 | awk -F '\t' '{ print ($1 == $2 ? "TRUE" : "FALSE") }'
TRUE
TRUE
FALSE
FALSE

paste이는 두 열에 있는 두 파일의 내용을 포함하는 두 개의 탭으로 구분된 열을 만드는 데 사용됩니다 . 이 awk명령은 각 행의 두 열을 비교하여 TRUE두 열이 동일한지 인쇄하고, 그렇지 않으면 을 인쇄합니다 FALSE.

답변3

두 파일의 줄 수가 동일하다고 가정합니다.

awk '{getline f2 < "file2"; print f2 == $0 ? "TRUE" : "FALSE"}' file1

비교할 문자열이 숫자이면 숫자 비교가 수행되고, 그렇지 않으면 어휘 비교가 수행됩니다. 예를 들어, 1001.0e2동일한 것으로 간주됩니다. f2"" == $0모든 경우에 어휘 비교를 강제 하도록 변경되었습니다 .

구현 에 따라 어휘 비교는 using (바이트 간 비교) 또는 using (두 문자열이 로캘의 데이터 정렬에서 동일하게 정렬되는지 여부) awk과 같이 수행됩니다 . 이는 예제에서처럼 모든 10진수 입력이 아닌 특정 문자 순서가 올바르게 정의되지 않은 일부 로케일에 영향을 미칠 수 있습니다.memcmp()strcoll()

답변4

루프 에서 bash각 파일을 읽고 while, 읽은 줄과 인쇄한 줄을 비교 TRUE하거나 FALSE적절하게 다음을 수행합니다.

while IFS= read -r -u3 line1; IFS= read -r -u4 line2; do
    [[ $line1 == $line2 ]] && echo TRUE || echo FALSE
done 3<file1 4<file2

이 두 호출은 read각각 파일 설명자 3과 4에서 읽습니다. 파일은 루프의 두 가지 입력 리디렉션을 통해 이러한 파일로 리디렉션됩니다.

관련 정보