Bir metin dosyasından satırları okuma ve her satırdaki her ad için bir metin dosyası oluşturma

21

Diyelim ki şöyle bir metin dosyası var:

john
george
james
stewert

her adın ayrı bir satırda.

Bu metin dosyasının satırlarını okumak ve her ad için bir metin dosyası oluşturmak istiyorum: john.txt , george.txt etc.

Bunu Bash’te nasıl yapabilirim?

    
sordu levato 22.11.2015 15:34

4 cevap

17

# 1 Bash + touch öğesinin kullanılması:

while read line; do touch "$line.txt"; done <in
  • while read line; [...]; done <in : read dosyasının kendisi read değerini döndürene kadar 1 çalıştırır; bu, dosyanın sonuna ulaştığında gerçekleşir; read girdisi, in yönlendirme nedeniyle terminalden geçerli çalışma dizinindeki <in adlı dosyadan okunur;
  • touch "$line.txt" : Bu, touch 'sinin $line.txt ' sinin line 'sini, ardından .txt ' si olan touch 'sini çalıştırır; xargs mevcut değilse dosyayı oluşturur ve varsa erişim süresini günceller;

# 2 touch + -a in değerini kullanma:

xargs -a in -I name touch name.txt
  • xargs : in değerini, geçerli çalışma dizinindeki -I name adlı bir dosyadan girdisini yapar;
  • xargs : name değerini, touch name 'nin her oluşumunu aşağıdaki komutta mevcut giriş satırı ile değiştirir;
  • touch : Değiştirilen name değerinde %code% değerini çalıştırır; Varsa dosyayı oluşturur ve varsa erişim süresini 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
    
verilen cevap kos 22.11.2015 15:49
18

Satır başına yalnızca tek bir kelimeye sahip olduğunuz bu özel durumda, ayrıca şunları yapabilirsiniz:

xargs touch < file

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

xargs -I {} touch {} < file

Sadece eğlence için, burada diğer iki yaklaşım vardır (her ikisi de, boşluk içeren satırlar da dahil olmak üzere, isteğe bağlı dosya adlarını işleyebilir):

  • Perl

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

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

Linux ve benzeri sistemlerde, uzantının dosyaların büyük çoğunluğu için isteğe bağlı olduğunu unutmayın. Bir metin dosyasına .txt uzantısı eklemek için bir neden yoktur. Bunu yapmakta özgürsünüz ama hiç farketmez. Bu nedenle, uzantıyı yine de istiyorsanız, şunlardan birini kullanın:

%pre%     
verilen cevap terdon 22.11.2015 17:58
7

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

testerdir:$ awk '{system("touch "
testerdir:$ echo "" | tee $(cat filelist)


testerdir:$ ls
filelist  george  james  john  stewert
)}' filelist testerdir:$ ls filelist george james john stewert testerdir:$ awk '{system("touch "
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
".txt")}' filelist testerdir:$ ls filelist george.txt james.txt john.txt stewert.txt george james john stewert

Başka bir yol, tee . Bir satırın filelistte birden fazla dizgi içeriyorsa bu yaklaşımın kesileceğine dikkat edin.

%pre%

Alternatif olarak, </dev/null tee $(cat filelist) , boru tesisatından kaçınmak istiyorsanız da yapılabilir

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

%pre%     
verilen cevap Sergiy Kolodyazhnyy 22.11.2015 18:06
7
  

Diyelim ki bir metin dosyanız var…

Diyelim ki bir cevabım var ;)

awk '{system("touch \""%pre%".txt\"")}' file

Ayrıca, boşluklarla ve bir sonekle de =)

    
verilen cevap A.B. 22.11.2015 18:04

Etiketlerdeki diğer soruları oku