Jak wybrać pierwszy wiersz z każdego pliku w katalogu i wydrukować go w nowym pliku tekstowym

13

Mam katalog z kilkoma .txtplikami.

Z każdego z tych plików chcę wybrać pierwszy wiersz i wydrukować go w nowym .txtpliku (aby uzyskać listę wszystkich pierwszych wierszy).

Próbowałem go z awki sedpoleceń i łączyć go z pętlą, ale bez powodzenia.

Annemieke Smet
źródło
1
Jako użytkownik reputacji 6: Jeśli którykolwiek z poniższych ankiet pomógł ci, nie zapomnij kliknąć szarego po lewej stronie jego tekstu, co oznacza Tak, ta odpowiedź jest prawidłowa ! ;-)
Fabby

Odpowiedzi:

21

Użyj head:

head -n1 -q *.txt > new-file
  • -n1mówi, headaby wyodrębnić tylko pierwszy wiersz.
  • -q nakazuje szefowi, aby nie drukował nazwy pliku.
choroba
źródło
9

Używanie grep:

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

grepdopasuje dowolny znak i zakończy działanie po pierwszym dopasowaniu, tj. grepwypisze pierwsze wiersze wszystkich plików wejściowych i zapisujemy je w out.txt.

heemayl
źródło
1
Podoba mi się, to fajny mały hack.
Hashim,
2

Używając tylko Bash:

for f in *.txt; do <"$f" read line; printf "$line\n" >>new.txt; done
  • *.txtjest rozwinięty do listy folderów / plików kończących się .txtna w bieżącym katalogu roboczym (ponieważ są tylko pliki, których foldery kończą .txtsię, nie są problemem);
  • <"$f" read lineodczytuje jeden wiersz ze ścieżki pliku zapisanej w fi zapisuje go line;
  • printf "$line\n" >>new.txt: dołącza treść linedo 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
źródło
kos, trochę za długi, ale tutaj jest +1 ..
heemayl
@heemayl Ale to tylko Bash. ;)
Kos
1
BTW
gratuluję na
1
@heemayl Dzięki: D. Szczerze mówiąc, sprawdzam tę stronę jak szaloną, aby chronić pytanie XD
Kos
0

Wypróbowałeś to awk, oto awkwersja

awk 'FNR==1 {print} {nextfile}' *.txt > out
AB
źródło
0

Innym podejściem do AWK jest nakazanie AWK wydrukowania, ale natychmiast przejście do następnego pliku

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

sedumożliwia także drukowanie określonych linii. Tutaj połączyłem to zfind

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

I perl:

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

Ostatni ale nie mniej ważny , grep

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

Zapisanie wszystkiego w jednym pliku to tylko kwestia dołączenia > outputFile.txtna końcu tych poleceń.

Sergiy Kolodyazhnyy
źródło