다음 파일의 모든 줄에 동일한 내용이 포함되어 있으면 "동일한 내용"이 인쇄되어야 합니다.
$ cat file
example-line
example-line
example-line
어떤 줄이 다른 줄과 다른 경우 "내용이 다릅니다"가 인쇄되어야 합니다.
예를 들어
$ cat file
example-line
somethingelse
example-line
"내용이 다릅니다"라고 인쇄됩니다.
답변1
사용 uniq
:
uniq -c testfile | [ $(wc -l) -eq 1 ] && echo 'contents are the same' || echo 'contents are different'
답변2
간결하고 휴대 가능하며 효율적으로 비교하려면 다음을 수행하면 됩니다.
awk '!seen[$0]++ && NR>1{exit 1}'
예를 들어 출력 메시지를 추가합니다.
$ cat file1
example-line
example-line
example-line
$ cat file2
example-line
somethingelse
example-line
$ awk '!seen[$0]++ && NR>1{f=1; exit} END{print "contents are " (f ? "different" : "same"); exit f}' file1
contents are same
$ echo $?
0
$ awk '!seen[$0]++ && NR>1{f=1; exit} END{print "contents are " (f ? "different" : "same"); exit f}' file2
contents are different
$ echo $?
1
답변3
사용 awk
. 키 이름을 배열로 매핑하고 unique
, 전체 파일이 처리될 때 배열에는 키가 하나만 있어야 합니다.
awk '!unique[$0]++ { count++ } END { print count == 1 ? "contents are same" : "contents are different" }' file
의 일반적인 구문은 awk
패턴-동작 모델입니다.
pattern { action }
!unique[$0]++
전체 행의 내용으로 키를 생성하여 해시 맵(연관 배열)을 생성하는 부분 입니다 $0
. 고유한 행이 처음 표시되면 값은 unique['<key-name>']
0이 되며 블록은 이 오류를 무효화하고 !
카운터를 증가시키는 실제 작업이 됩니다.{..}
또한 값을 사후 증가시키기 때문에 동일한 줄이 연속적으로 발생하는 경우 부정하면 부울 오류 조건이 생성되어 블록이 {..}
실행되지 않게 됩니다. END
모든 라인이 처리된 후 명령을 실행하십시오. 처리가 끝나면 배열에 키가 하나만 있으므로 이러한 행이 동일하다고 선언합니다.
답변4
아래 awk 솔루션을 사용해 보았는데 훌륭하게 작동합니다.
주문하다
i=`awk '{if (!seen[$0]++){print $0}}' filename| wc -l`
if [[ $i == 1 ]]; then echo "contents are same"; else echo "contents are different"; fi