Metin dosyasından satırları okumak ve her satırdaki her ad için bir metin dosyası oluşturmak


21

Diyelim ki bir metin dosyası var:

john
george
james
stewert

Her isim ayrı bir satırda.

Bu metin dosyasının satırları okuyup gibi her isim için bir metin dosyası oluşturmak istiyorum: john.txt, george.txtvb

Bash'te bunu nasıl yapabilirim?


2
Uzantıya ihtiyacınız var mı? Metin dosyalarının Linux'ta bir txt uzantısına sahip olması için hiçbir neden yoktur.
terdon

Yanıtlar:


18

# 1 Bash + kullanarak touch:

while read line; do touch "$line.txt"; done <in
  • while read line; [...]; done <in: Bu , dosyanın sonuna ulaşıldığında gerçekleşen kendi başına dönene readkadar çalışır ; girişi , yönlendirme nedeniyle terminalden ziyade geçerli çalışma dizininde adı verilen bir dosyadan okunur ;read1readin<in
  • touch "$line.txt": Bu, touchdeğeri izleyen ve $line.txtbunun içeriği olan genişletilmiş değer üzerinde çalışır ; eğer mevcut değilse dosyayı oluşturacak ve eğer varsa erişim zamanını güncelleyecektir;line.txttouch

# 2 xargs+ kullanarak touch:

xargs -a in -I name touch name.txt
  • -a in: mevcut çalışma dizinindeki xargsbir dosyadan girişini okur in;
  • -I name: Aşağıdaki komutta, mevcut giriş satırının xargsher oluşumunu değiştirir name;
  • touch name: touchDeğiştirilen değeri üzerinde çalışır name; mevcut değilse dosyayı oluşturur ve mevcutsa erişim zamanını günceller;
% 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

read linesatırı nasıl okuyacak? @kos
kashish

@kashish <insonra doneyapar readiçinde whiledöngü durumu okumak ve depolamasına bir satır iniçinde lineher tekrarda; Bu şekilde, touch "$line.txt"ilmek iç .txtkısmı sonda ile okuma çizgisine genişletilecektir .
kos

olacak while read line; do touch "$line.txt"; done <inyalnız iş yapmak? Kaynak dosya nerede?
Kashish

@kashish Elbette, onlar alternatif yöntemlerdir: ikisini birden kullanmanız gerekir.
kos

1
@kashish böyle readçalışır. Bakın help read.
terdon

18

Her satırda yalnızca tek bir kelimeye sahip olduğunuz bu durumda, şunları da yapabilirsiniz:

xargs touch < file

Dosya adlarınız boşluk içeriyorsa, bunun kırılacağını unutmayın. Bu gibi durumlarda, bunun yerine bunu kullanın:

xargs -I {} touch {} < file

Sadece eğlence için, işte bir kaç başka yaklaşım (her ikisi de boşluk içeren satırlar dahil olmak üzere isteğe bağlı dosya adlarını işleyebilen):

  • Perl

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

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

Linux ve benzeri sistemlerde, uzantıların çoğu dosya için isteğe bağlı olduğunu unutmayın. .txtMetin dosyasına bir uzantı eklemek için hiçbir neden yoktur . Bunu yapmakta özgürsünüz ama hiç bir önemi yoktur. Yani, yine de uzantıyı istiyorsanız, aşağıdakilerden birini kullanın:

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

7

AWK, bu görev için de uygundur:

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

Başka bir yol tee. Bir çizginin, filelist'te birden fazla dize içeriyorsa, bu yaklaşımın kopacağına dikkat edin.

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


testerdir:$ ls
filelist  george  james  john  stewert

</dev/null tee $(cat filelist)Borulardan kaçınmak istiyorsanız alternatif olarak da yapılabilir.

cp /dev/null yaklaşım (Bunun gösterdiğim gibi, boşluk içeren dosya isimleriyle çalışıyor):

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

1
@kos, dosyadaki her satır satır başına tam olarak bir dize içeriyorsa, o zaman satır başına bir dosya oluşturur. Aynı şekilde etkilidir echo "" | tee file1 file2 file2. Ancak dosya isimleri boşluk içeriyorsa kırılır.
Sergiy Kolodyazhnyy

7

Diyelim ki bir metin dosyam var…

Diyelim ki bir cevabım var ;)

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

Boşluklarla ve sonekle de su geçirmez =)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.