파일 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
비교할 문자열이 숫자이면 숫자 비교가 수행되고, 그렇지 않으면 어휘 비교가 수행됩니다. 예를 들어, 100
및 1.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에서 읽습니다. 파일은 루프의 두 가지 입력 리디렉션을 통해 이러한 파일로 리디렉션됩니다.