Saya punya string seperti
"aaa,aaa,aaa,bbb,bbb,ccc,bbb,ccc"
Saya ingin menghapus duplikat kata dari string maka hasilnya akan seperti
"aaa,bbb,ccc"
Saya mencoba Sumber kode ini
$ echo "zebra ant spider spider ant zebra ant" | xargs -n1 | sort -u | xargs
Ini berfungsi dengan baik dengan nilai yang sama, tetapi ketika saya memberikan nilai variabel saya maka itu menunjukkan semua kata duplikat juga.
Bagaimana saya bisa menghapus nilai duplikat.
MEMPERBARUI
Pertanyaan saya adalah menambahkan semua nilai yang sesuai ke dalam string tunggal jika pengguna sama. Saya punya data seperti ini ->
user name | colour
AAA | red
AAA | black
BBB | red
BBB | blue
AAA | blue
AAA | red
CCC | red
CCC | red
AAA | green
AAA | red
AAA | black
BBB | red
BBB | blue
AAA | blue
AAA | red
CCC | red
CCC | red
AAA | green
Dalam pengkodean saya mengambil semua pengguna yang berbeda maka saya berhasil merangkai string warna. Untuk itu saya menggunakan kode -
while read the records
if [ "$c" == "" ]; then #$c I defined global
c="$colour1"
else
c="$c,$colour1"
fi
Ketika saya mencetak variabel $ c ini saya mendapatkan output (Untuk Pengguna AAA)
"red,black,blue,red,green,red,black,blue,red,green,"
Saya ingin menghapus warna duplikat. Maka output yang diinginkan harus seperti
"red,black,blue,green"
Untuk output yang diinginkan ini saya menggunakan kode di atas
echo "zebra ant spider spider ant zebra ant" | xargs -n1 | sort -u | xargs
tetapi menampilkan output dengan nilai duplikat .Seperti
"merah, hitam, biru, merah, hijau, merah, hitam, biru, merah, hijau," Terima kasih
sumber
echo 'aaa aaa aaa bbb bbb ccc bbb ccc' | xargs -n1 | sort -u | xargs
memberikanaaa bbb ccc
.. jadi Anda harus menunjukkan kode yang tepat Anda lelah dan output yang Anda dapatkan .. dengan string dalam variabel:s='aaa aaa aaa bbb bbb ccc bbb ccc'; echo "$s" | xargs -n1 | sort -u | xargs
Jawaban:
Satu lagi awk, hanya untuk bersenang-senang:
Omong-omong, bahkan solusi Anda berfungsi dengan baik dengan variabel:
sumber
%s
alih-alih%s%s
. Alasannya adalah bahwa saya melakukan loop for melalui hasil dan dua spasi putih menyebabkan beberapa tantangan dengan pertandingan regex.Dengan
tr
,sort
danuniq
atau
untuk mendapatkan satu baris
sumber
| xargs
untuk bergabung dengan output ke satu baris lagisort -u
. Atau bahkan aawk '!u[$0]++
.sort -u
. Saya telah menggunakansort | uniq
selama ini.sumber
Dengan gnu
sed
:Anda dapat menambahkan
;s/ */ /g
untuk menghapus ruang dublicate.Fungsi seperti ini: Jika sebuah kata adalah yang kedua kalinya di baris ini, hapus dan mulai lagi sampai tidak ada publikasi yang ditemukan lagi.
sumber
\<
dan\>
?sumber
Solusi awk wajib:
(Final
echo
ada di sana untuk baris baru)sumber
sort
solusi tidak menyimpan urutan asli baik, meskipun.awk -vRS=" " -vORS=" " '!a[$1]++ {print $1}' ; echo
Ini menjaga pesanan.Python
Pilihan 1
Jadikan dapat dieksekusi, lalu panggil dari Bash:
Atau Anda bisa mengimplementasikannya sebagai fungsi Bash, tetapi sintaksnya berantakan.
pilihan 2
Opsi ini dapat menjadi satu garis jika diperlukan:
Di Bash:
sumber
sumber
awk
implementasi tertentu yang digunakan (asorti()
bukanawk
fungsi standar ).Menggunakan data tabular asli dalam file bernama
file
:Ini menghasilkan
Tiga langkah dari pipa:
sed
perintah menghilangkan baris pertama yang merupakan header yang kita tidak ingin membaca.The
sort
perintah memberi kita garis yang unik. Sampel data setelahsort
terlihat sepertiawk
perintah mengambil data ini dan menghasilkan string koma-delimited untuk setiap pengguna dalam arraycolor
(dimana username adalah kunci ke dalam array). Pada akhirnya (diEND
blok), semua data yang dikumpulkan dikeluarkan.sumber
sumber