Як вибрати перший рядок з кожного файлу в каталозі та роздрукувати його в новому текстовому файлі


13

У мене каталог з декількома .txtфайлами.

З кожного з цих файлів я хочу вибрати перший рядок і надрукувати його в новий .txtфайл (щоб отримати список усіх перших рядків).

Я спробував з awkі sedкомандами і з'єднав його з петлею, але без успіху.


1
Оскільки ви користуєтесь репутацією 6: Якщо вам допомогла будь-яка з нижчевикладених нижче, не забудьте натиснути сіру ліворуч від тексту, що означає , що ця відповідь є дійсною ! ;-)
Fabby

Відповіді:


21

Використання head:

head -n1 -q *.txt > new-file
  • -n1повідомляє headвитягнути лише перший рядок.
  • -q каже голові не друкувати ім'я файлу.

9

Використання grep:

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

grepбуде відповідати будь-якому символу і вийде після першого збігу, тобто grepвиведе перші рядки всіх вхідних файлів, і ми зберігаємо їх у out.txt.


1
Мені це подобається, це приємний маленький хак.
Хашим

2

Використовуючи лише Bash:

for f in *.txt; do <"$f" read line; printf "$line\n" >>new.txt; done
  • *.txtрозширюється до списку папок / файлів, що закінчуються .txtв поточній робочій папці (оскільки є лише файли, які закінчуються папками, .txtякі не закінчують );
  • <"$f" read lineчитає один рядок із шляху до файлу, що зберігається в ньому, fі зберігає його line;
  • printf "$line\n" >>new.txt: додає вміст lineдо 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, трохи довгий, але ось +1 ..
heemayl

@heemayl Але це лише Bash. ;)
kos

1
BTW вітаю 15k :)
heemayl

1
@heemayl Дякую: D. Чесно кажучи, я перевіряю сайт як божевільний лише для захисту питання XD
kos

0

Ви спробували це awk, ось awkверсія

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

0

Інший підхід з AWK полягає в тому, щоб сказати AWK надрукувати, але потім негайно перейти до наступного файлу

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

sedтакож дозволяє друкувати конкретні лінії. Тут я поєднав це зfind

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

І перл:

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

І останнє, але не менш важливе, grep

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

Збереження всього в одному файлі - лише питання додавання > outputFile.txtв кінці цих команд.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.