次のファイルのすべての行に同じ内容が含まれている場合は、「同じ内容」を印刷する必要があります。
$ 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