Bagaimana mencegah grep mencetak string yang sama beberapa kali?

14

Jika saya mengambil file yang berisi berikut ini:

These are words
These are words
These are words
These are words

... untuk kata These, itu akan mencetak string These are wordsempat kali.

Bagaimana saya mencegah grep mencetak string berulang lebih dari satu kali? Kalau tidak, bagaimana saya bisa memanipulasi output grep untuk menghapus garis duplikat?

Trae
sumber
Haruskah urutan pertandingan disimpan dalam output? Kalau tidak, perintah John1024 yang diposting akan bekerja.
kos

Jawaban:

21

Filosofi Unix adalah memiliki alat yang melakukan satu hal dan melakukannya dengan baik. Dalam hal ini, grepadalah alat yang memilih teks dari file. Untuk mengetahui apakah ada duplikat, satu jenis teks. Untuk menghapus duplikat, orang menggunakan -uopsi untuk sort. Jadi:

grep These filename | sort -u

sortmemiliki banyak opsi: lihat man sort. Jika Anda ingin menghitung duplikat atau memiliki skema yang lebih rumit untuk menentukan apa yang bukan atau tidak duplikat, maka pipa hasil sortir ke uniq: grep These filename | sort | uniqdan lihat manuniq` untuk opsi.

John1024
sumber
2

Menggunakan grepdan saklar tambahan, jika Anda hanya mencari string tunggal

grep -m1 'These' filename

Dari man grep

-m NUM, --max-count=NUM
        Stop reading a file after NUM matching lines.  If the input is
        standard input from a regular file, and NUM matching lines are
        output, grep ensures that the standard input is positioned  to
        just  after  the  last matching  line  before exiting, regardless
        of the presence of trailing context lines.  This enables a calling
        process to resume a search.  When grep stops after NUM matching
        lines, it outputs any trailing context lines.  When the -c or
        --count option is also used, grep does not output a count greater
        than NUM.  When the -v or --invert-match option is also used, grep
        stops after outputting NUM non-matching lines.

atau menggunakan awk ;)

awk '/These/ {print; exit}' foo
AB
sumber
IMHO jawaban yang paling tepat adalah flag -m. Saya sarankan Anda meletakkannya di bagian atas jawaban Anda. Jawaban yang sangat bagus
Sergiy Kolodyazhnyy
3
Ini tidak akan berfungsi jika Anda menggunakan regex - itu akan berhenti segera setelah pertandingan pertama, tidak pastikan Anda mendapatkan satu dan hanya satu dari setiap pertandingan yang memungkinkan.
csvan