Saya memiliki string seperti: dog cat bird whale
Dan saya ingin mendapatkannya dog dog cat cat bird bird whale whale
Semua kata berada di baris yang sama. Ada ide?
Menambah keluarga solusi :-).
duplicator.sh
:
for i; do echo -n "$i $i "; done; echo
Jadikan dapat dieksekusi, dan sekarang:
$ ./duplicator.sh dog cat bird whale
dog dog cat cat bird bird whale whale
Atau sebagai fungsi shell, mis. Agar dapat digunakan kembali dalam skrip:
duplicator() {
for i; do echo -n "$i $i "; done; echo
}
yang kemudian dapat dijalankan langsung di mana didefinisikan sebagai
duplicator dog cat bird whale
Anda bisa menggunakan
sed
:Jika Anda ingin menyimpan perubahan ke file di tempat, katakan:
Anda juga bisa menggunakan
perl
:(Tambahkan
-i
opsi untuk menyimpan perubahan ke file di tempat.)Atau, seperti yang disarankan oleh terdon :
Mengutip dari
perlvar
:sumber
sed -r 's/\S+/& &/g'
.-a
:perl -M5.10.0 -ane 'say join " ", map{$_, $_} @F;'
Apa ini tanpa
awk/gawk
jawaban:Jika penghentian baris baru penting:
sumber
for(i=1;i<=NF;++i) printf "%s %s ",$i,$i;
keduanya lebih pendek dan lebih mudah dibaca, IMHO.sumber
sed -n 'p;p'
- saya pikir itu lebih transparan tentang apa yang dilakukannya.Jika Anda memiliki string dalam suatu variabel, katakanlah
foo="dog cat bird whale"
, Anda bisa melakukan:Pesta murni:
Penjelasan: Tanda kurung diperlukan agar
read
danecho
terjadi dalam subkulit yang sama dan karenanya dapat berbagi variabel. Tanpa mereka,echo
hanya akan mencetak garis kosong.coreutils:
Penjelasan: The
-o
Benderajoin
memungkinkan Anda untuk mengatur format output. Di sini, saya mengatakannya untuk mencetak bidang 1 file 1 (1.1
), diikuti oleh bidang 2 file 1 (1.2
) dll. Dengan begitu setiap bidang file 1 dicetak dua kali. Namun,join
dirancang untuk, well, bergabung dengan dua jalur input pada bidang yang sama. Jadi, saya juga memberikannya baris kosong (<(echo)
) dan kemudian mengabaikannya. The-j
set bergabung lapangan, pengaturan untuk salah satu yang tidak ada (ke-5) penyebabjoin
untuk mencetak seluruh baris.Jika Anda tidak peduli dengan spasi putih atau urutan input, Anda bisa melakukannya
Perl 1:
Penjelasan:
Script di atas akan menyimpan setiap bidang (dari
@F
) dua kali dalam array@k
dan kemudian mencetak@k
. Jika Anda tidak memerlukan trailing newline, Anda dapat menyederhanakannyaPerl 2:
Penjelasan: The
-0
option menetapkan pemisah record input (sebagai heksadesimal atau nomor oktal, lihat di sini untuk konversi). Di sini, saya mengaturnya ke oktal040
yang merupakan ruang. The-p
merekperl
mencetak setiap masukan "line" dan karena kami telah menetapkan rekor pemisah ruang, garis sekarang didefinisikan oleh spasi, sehingga setiap bidang dicetak dua kali.awk
:Penjelasan:
NF
adalah jumlah bidang, jadi skrip di atas melewati setiap bidang dan menambahkannya sendiri. Setelah selesai, kami mencetak baris (1;
hanya singkatan untuk cetak).sumber
Sekarang untuk
python
jawabannya:Dari baris perintah:
Dari stdin:
Hasilnya dalam kedua kasus:
sumber
Sedikit berlebihan, tetapi sebuah
haskell
jawaban:sumber
Pendekatan lain, juga hanya menggunakan bash builtins
Saya tidak melihat manfaat apa pun dibandingkan dengan jawaban teratas, hanya untuk menunjukkan cara yang sedikit berbeda, yang mungkin lebih cocok untuk beberapa tujuan.
sumber
echo
juga merupakan builtin shell di Bash (testtype echo
).