Jawaban:
Di bawah ini ada sekitar selusin contoh cara Anda dapat mengambil file seperti ini:
$ cat k.txt
1
2
3
dan konversikan ke format ini:
1,2,3
Anda dapat menggunakan perintah ini untuk membuat file di atas jika Anda ingin bermain bersama:
$ cat <<EOF > k.txt
1
2
3
EOF
Contoh di bawah ini dibagi menjadi 2 kelompok. Yang "bekerja" dan yang "hampir" bekerja. Saya meninggalkan ini karena sering kali itu sama berharganya dengan melihat mengapa sesuatu tidak bekerja, seperti melihat mengapa sesuatu bekerja.
Sebagian besar bahasa scripting yang saya kenal diwakili. Beberapa diwakili beberapa kali, karena seperti akronim terkenal yang biasanya dirujuk dalam Perl, TIMTOWTDI .
CATATAN: Anda dapat menukar koma ( ,
) dalam contoh di bawah ini dan menggantinya dengan karakter apa pun yang Anda inginkan, yaitu |
.
Cuplikan kode ini akan menghasilkan output yang diinginkan.
The paste
perintah:
$ paste -s -d ',' k.txt
1,2,3
The sed
perintah:
$ sed ':a;N;$!ba;s/\n/,/g' k.txt
1,2,3
$ sed ':a;{N;s/\n/,/};ba' k.txt
1,2,3
The perl
perintah:
$ perl -00 -p -e 's/\n(?!$)/,/g' k.txt
1,2,3
$ perl -00 -p -e 'chomp;tr/\n/,/' k.txt
1,2,3
The awk
perintah:
$ awk '{printf"%s%s",c,$0;c=","}' k.txt
1,2,3
$ awk '{printf "%s,",$0}' k.txt | awk '{sub(/\,$/,"");print}'
1,2,3
$ awk -vORS=, 1 k.txt | awk '{sub(/\,$/,"");print}'
1,2,3
$ awk 'BEGIN {RS="dn"}{gsub("\n",",");print $0}' k.txt | awk '{sub(/\,$/,"");print}'
1,2,3
The python
perintah:
$ python -c "import sys; print sys.stdin.read().replace('\n', ',')[0:-1]" <k.txt
1,2,3
$ python -c "import sys; print sys.stdin.read().replace('\n', ',').rstrip(',')" <k.txt
1,2,3
Bash bawaan mapfile
:
$ mapfile -t a < k.txt; (IFS=','; echo "${a[*]}")
1,2,3
The ruby
perintah:
$ ruby -00 -pe 'gsub /\n/,",";chop' < k.txt
1,2,3
$ ruby -00 -pe '$_.chomp!"\n";$_.tr!"\n",","' k.txt
1,2,3
The php
perintah:
$ php -r 'echo strtr(chop(file_get_contents($argv[1])),"\n",",");' k.txt
1,2,3
Peringatan
Sebagian besar contoh di atas akan berfungsi dengan baik. Beberapa memiliki masalah tersembunyi, seperti contoh PHP di atas. Fungsi chop()
ini sebenarnya adalah alias untuk rtrim()
, jadi spasi trailing baris terakhir juga akan dihapus.
Demikian juga contoh Ruby pertama, dan contoh Python pertama. Masalahnya adalah bagaimana mereka semua menggunakan jenis operasi yang pada dasarnya "memotong", secara membabi buta, karakter yang tertinggal. Ini bagus untuk contoh yang diberikan OP, tetapi harus berhati-hati ketika menggunakan jenis satu liner ini untuk memastikan bahwa mereka sesuai dengan data yang mereka proses.
Contoh
Katakan file sampel kami, yang k.txt
terlihat seperti ini:
$ echo -en "1\n2\n3" > k.txt
Itu terlihat mirip tetapi memiliki satu sedikit perbedaan. Itu tidak memiliki trailing newline ( \n
) seperti file asli. Sekarang ketika kita menjalankan contoh Python pertama kita mendapatkan ini:
$ python -c "import sys; print sys.stdin.read().replace('\n', ',')[0:-1]" <k.txt
1,2,
Ini adalah contoh "selalu pengiring pengantin, tidak pernah pengantin" . Sebagian besar dari mereka mungkin bisa diadaptasi, tetapi ketika bekerja solusi potensial untuk masalah, ketika rasanya "dipaksakan", itu mungkin alat yang salah untuk pekerjaan itu!
The perl
perintah:
$ perl -p -e 's/\n/,/' k.txt
1,2,3,
The tr
perintah:
$ tr '\n' ',' < k.txt
1,2,3,
The cat
+ echo
perintah:
$ echo $(cat k.txt)
1 2 3
The ruby
perintah:
$ ruby -pe '$_["\n"]=","' k.txt
1,2,3,
Bash's while
+ read
bawaan:
$ while read line; do echo -n "$line,"; done < k.txt
1,2,3,
awk
saya lebih suka alternatif yang lebih pendek:awk -vORS=, 1 k.txt
bash
:mapfile -t a < k.txt; (IFS=','; echo "${a[*]}")
perl
dan pertama awk
memilikinya juga.
paste
di atas. Itulah tepatnya paste -s
untuk di sini. Ini adalah perintah standar dan akan menjadi yang paling efisien. Semua yang lain adalah berlebihan dan / atau tidak portabel atau memiliki keterbatasan.
mapfile
relatif baru, ditambahkan pada bash
4.0.
@slm sudah memberikan jawaban yang bagus, tetapi sebagai pertanyaan Anda "format output of xargs"
xargs -I{} echo -n "{}|" < test.txt
-I
adalah opsi "ganti string".{}
adalah pengganti untuk teks keluaran.Jika Anda ingin menghilangkan trailing, |
Anda dapat menggunakannya sed
untuk melakukan pembersihan:
$ xargs -I{} echo -n "{}|" < k.txt | sed -e 's/|$//'
1|2|3
tr
, sed
dan lainnya juga ..
Ini adalah utas lama, saya tahu. OP bertanya dengan kode sederhana seperti ini. Untuk tetap dekat dengan aslinya, saya punya solusi sederhana.
cat k.txt | xargs
1 2 3
gunakan sed
cat k.txt | xargs | sed 's/ /,/g'
1,2,3
atau
cat k.txt | xargs | sed 's/ /|/g'
1|2|3
sed bisa terlihat sedikit aneh tapi rusak, itu masuk akal.
Ini untuk pengganti. g 'adalah untuk global: tanpa ini, ia hanya akan melakukan penggantian pertama pada setiap baris baru. Karena Anda menggunakan 'xargs', ini akan menampilkannya sebagai satu baris. Jadi, Anda akan mendapatkan "1,2 3".
Pembatas digunakan untuk pemisahan. Saya menggunakan karakter /. Satu trik yang menarik: Anda dapat mengganti pembatas dengan sebagian besar karakter lain, selama kami menyimpannya dalam format yang sama di antara tanda kutip. Jadi ini akan berhasil juga ....
cat k.txt | xargs | sed 's# #,#g'
atau
cat k.txt | xargs | sed 'sT T,Tg'
Jelas, menggunakan karakter tertentu sebagai pembatas bisa membingungkan, jadi cerdaslah.
xargs <k.txt | tr \ \|
Anda tidak perlu cat
- hanya lulus dalam file input dan - jika diberikan perintah tidak lain - xargs
akan pingsan format default - yang merupakan satu jenis dengan /bin/echo
's (tanpa interpretasi backslash c-escape) .
xargs
akan menghapus spasi putih kepala / ekor dari file input dan menekan urutan spasi putih lainnya ke satu ruang. Ini berarti bahwa sementara lewat file dari tr
ke xargs
seperti:
tr \\n \| <k.txt | xargs
... mencetak ...
1|2|3|
... pergi ke arah lain dan hanya beroperasi pada argumen bahwa batasanxargs
ruang tidak ....
1|2|3\n
... karena xargs
mencetak baris akhir baris terakhir (seperti yang diperlukan untuk file teks) , tetapi tidak mendapatkan tr
penjelasan seperti itu.
Perhatikan, bagaimanapun, bahwa ini (atau solusi lain yang ditawarkan di sini) tidak diperhitungkan untuk xargs
mengutip input. xargs
akan membagikan karakter spasi whitespace non-baris tunggal / ganda / backslash yang dikutip dalam input, yang dapat dikutip seperti:
xargs <<\IN
1 2' 3'\' \'4
IN
1 2 3' '4
xargs cat -n
, tetapi lebih mudah jika Anda hanya memotong karakter baris baru, ini dapat dicapai denganecho $(cat)
,grep
atauawk
(merangkak cara melakukannya).xargs
tidak cocok untuk tujuan Anda saat ini.