Membaca baris dari file teks dan membuat file teks untuk setiap nama di setiap baris

21

Katakanlah saya memiliki file teks seperti:

john
george
james
stewert

dengan setiap nama pada baris terpisah.

Saya ingin membaca baris file teks ini dan membuat file teks untuk setiap nama, seperti: john.txt, george.txtdll

Bagaimana saya bisa melakukan ini di Bash?

levato
sumber
2
Apakah Anda memerlukan ekstensi? Tidak ada alasan untuk file teks memiliki ekstensi txt di Linux.
terdon

Jawaban:

18

# 1 Menggunakan Bash + touch:

while read line; do touch "$line.txt"; done <in
  • while read line; [...]; done <in: Ini berjalan readsampai readkembali dengan sendirinya 1, yang terjadi ketika ketika akhir file tercapai; input untuk readdibaca dari file yang disebutkan indalam direktori kerja saat ini alih-alih dari terminal karena <inpengalihan;
  • touch "$line.txt": Ini berjalan touchpada nilai diperluas $line.txt, yang merupakan konten linediikuti oleh .txt; touchakan membuat file jika tidak ada dan memperbarui waktu aksesnya jika ada;

# 2 Menggunakan xargs+ touch:

xargs -a in -I name touch name.txt
  • -a in: membuat xargsmembaca inputnya dari file yang disebutkan indalam direktori kerja saat ini;
  • -I name: membuat xargsganti setiap kemunculan namedengan jalur input saat ini dalam perintah berikut;
  • touch name: Berjalan touchpada nilai yang diganti dari name; itu akan membuat file jika tidak ada dan memperbarui waktu aksesnya jika ada;
% ls
in
% cat in
john
george
james
stewert
% while read line; do touch "$line.txt"; done <in
% ls
george.txt  in  james.txt  john.txt  stewert.txt
% rm *.txt
% xargs -a in -I name touch name.txt
% ls
george.txt  in  james.txt  john.txt  stewert.txt
kos
sumber
bagaimana read linesebenarnya akan membaca baris? @kos
kashish
@kashish <insetelah donemerek readdi whilekondisi loop membaca dan menyimpan satu baris dari indalam linepada setiap iterasi; dengan cara ini, touch "$line.txt"di dalam loop akan diperluas ke baris baca dengan .txtdi akhir.
kos
akan while read line; do touch "$line.txt"; done <insendirian melakukan pekerjaan itu? Di mana file sumbernya?
Kashish
@ashish Tentu, itu metode alternatif: Anda harus menggunakan salah satu atau yang lain.
kos
1
@ashish begitulah cara readkerjanya. Lihat help read.
terdon
18

Dalam kasus khusus ini, di mana Anda hanya memiliki satu kata per baris, Anda juga dapat melakukan:

xargs touch < file

Perhatikan bahwa ini akan pecah jika nama file Anda dapat berisi spasi. Untuk kasus seperti itu, gunakan ini sebagai gantinya:

xargs -I {} touch {} < file

Hanya untuk bersenang-senang, berikut adalah beberapa pendekatan lain (keduanya dapat menangani nama file yang berubah-ubah, termasuk baris dengan spasi):

  • Perl

    perl -ne '`touch "$_"`' file
  • Awk

    awk '{printf "" > $0}' file 

Perhatikan bahwa pada Linux dan sistem serupa, ekstensi bersifat opsional untuk sebagian besar file. Tidak ada alasan untuk menambahkan .txtekstensi ke file teks. Anda bebas untuk melakukannya tetapi tidak ada bedanya sama sekali. Jadi, jika Anda tetap menginginkan ekstensi, gunakan salah satu dari:

xargs -I {} touch {}.txt < file
perl -ne '`touch "$_.txt"`' file
awk '{printf "" > $0".txt"}' file 
terdon
sumber
7

AWK juga sesuai untuk tugas ini:

testerdir:$ awk '{system("touch "$0)}' filelist

testerdir:$ ls
filelist  george  james  john  stewert

testerdir:$ awk '{system("touch "$0".txt")}' filelist                          

testerdir:$ ls
filelist  george.txt  james.txt  john.txt  stewert.txt
george    james       john       stewert

Cara lain tee,. Perhatikan bahwa pendekatan ini akan terputus jika sebuah baris berisi lebih dari satu string dalam daftar file.

testerdir:$ echo "" | tee $(cat filelist)


testerdir:$ ls
filelist  george  james  john  stewert

Atau, </dev/null tee $(cat filelist)bisa dilakukan juga, jika Anda ingin menghindari perpipaan

cp /dev/null pendekatan (Seperti yang saya tunjukkan ini berfungsi dengan nama file yang berisi spasi):

testerdir:$ cat filelist | xargs -I {}  cp /dev/null  "{}"                     

testerdir:$ ls
filelist  FILE WITH SPACES  george  james  john  stewert

testerdir:$ ls FILE\ WITH\ SPACES                                              
FILE WITH SPACES
Sergiy Kolodyazhnyy
sumber
1
@kos jika setiap baris dalam file berisi tepat satu string per baris, maka itu membuat file per baris. Secara efektif sama dengan echo "" | tee file1 file2 file2. Tapi itu pecah jika nama file mengandung spasi.
Sergiy Kolodyazhnyy
7

Katakanlah saya punya file teks ...

Katakanlah, saya punya jawaban ;)

awk '{system("touch \""$0".txt\"")}' file

Tahan air juga dengan spasi dan akhiran =)

AB
sumber