Bir dizindeki her dosyadan ilk satırı seçme ve yeni bir metin dosyasına yazdırma


13

Birkaç .txtdosya içeren bir dizin var .

Bu dosyaların her birinden, ilk satırı seçmek ve yeni bir .txtdosyaya yazdırmak istiyorum (tüm ilk satırların bir listesini almak için).

awkVe sedkomutları ile denedim ve bir döngü ile birleştirdim, ancak başarılı olamadı.


1
İtibar 6 kullanıcısı olduğunuz için: Aşağıdaki anws kullanıcılarından herhangi biri size yardımcı olduysa , metninin solundaki gri renkli işaretini tıklamayı unutmayın , yani Evet, bu cevap geçerlidir ! ;-)
Fabby

Yanıtlar:


21

Kullanım head:

head -n1 -q *.txt > new-file
  • -n1headsadece ilk satırı almayı söyler .
  • -q kafasına dosya adını yazdırmamasını söyler.

9

Kullanma grep:

grep -m 1 '.' *.txt >output.file

grepherhangi bir karakterle eşleşecek ve ilk eşleşmeden sonra grepçıkacak, yani tüm girdi dosyalarının ilk satırlarını çıkaracak ve bunları kaydediyoruz out.txt.


1
Bunu beğendim, güzel bir hack.
Hashim

2

Yalnızca Bash kullanma:

for f in *.txt; do <"$f" read line; printf "$line\n" >>new.txt; done
  • *.txt.txtgeçerli çalışma diziniyle biten klasörler / dosyalar listesine genişletilir (çünkü yalnızca biten dosyalar .txtendişe verici değildir);
  • <"$f" read lineiçinde saklanan dosya yolundan bir satır okur fve saklar line;
  • printf "$line\n" >>new.txt: İçeriğini ekler lineiçin new.txt;
% cat foo.txt 
line #1 in foo
line #2 in foo
line #3 in foo

% cat bar.txt
line #1 in bar
line #2 in bar
line #3 in bar

% for f in *.txt; do <"$f" read line; printf "$line\n" >>new.txt; done

% cat new.txt 
line #1 in bar
line #1 in foo

Kos, biraz uzun ama burada +1 ..
heemayl

@heemayl Ama sadece Bash. ;)
kos

1
BTW 15k için tebrikler :)
heemayl

1
@heemayl Teşekkürler: D. Dürüst olmak gerekirse ben sadece bir soru korumak için deli gibi siteyi kontrol ediyorum XD
kos

0

Bunu denediniz awk, işte bir awkversiyon

awk 'FNR==1 {print} {nextfile}' *.txt > out

0

AWK ile bir başka yaklaşım AWK'ya yazdırmasını söylemektir, ancak hemen bir sonraki dosyaya git

tmp:$ touch file1 file2 file3

tmp:$ printf  "Line 1 \n Line 2" | tee file1 file2 file3
Line 1 
 Line 2
tmp:$ awk '{print;nextfile}' file1 file2 file3
Line 1 
Line 1 
Line 1

sedayrıca belirli hatların yazdırılmasını sağlar. İşte ben ile birleştirdimfind

tmp:$ find . -name "file*" -exec  sed -n '1p' {} \;                            
Line 1 
Line 1 
Line 1 

Ve perl:

tmp:$ find . -name "file*"  -exec perl -ne 'print  if 1..1' {} \;              
Line 1 
Line 1 
Line 1 

Ve son ama en az değil , grep

tmp:$ grep -n 1 file1 file2 file3                                              
file1:1:Line 1 
file2:1:Line 1 
file3:1:Line 1 

Her şeyi tek bir dosyaya kaydetmek, yalnızca > outputFile.txtbu komutların sonuna ekleme meselesidir .

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.