检查文件中的所有行是否相同

检查文件中的所有行是否相同

如果以下文件在所有行中包含相同的内容,则应打印“内容相同”。

$ 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

相关内容