ファイルのすべての行が同じであることを確認する

ファイルのすべての行が同じであることを確認する

次のファイルのすべての行に同じ内容が含まれている場合は、「同じ内容」を印刷する必要があります。

$ 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、ファイル全体が処理されるとき、配列にはキーが1つだけ必要です。

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すべての行が処理されたら、コマンドを実行してください。処理が終わると、配列にキーが1つしかないので、これらの行は同じであると宣言します。

答え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

関連情報