如果以下文件在所有行中包含相同的内容,则应打印“内容相同”。
$ 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>']
将为零,并且该块否定此错误并成为我们递增计数器的部分!
的真实操作。{..}
由于我们还对该值进行后递增,因此对于同一行的后续出现,否定将产生一个布尔错误条件,导致该{..}
块不被执行。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