Как выбрать первую строку из каждого файла в каталоге и распечатать его в новый текстовый файл

13

У меня есть каталог с несколькими .txtфайлами.

Из каждого из этих файлов я хочу выбрать первую строку и распечатать ее в новый .txtфайл (чтобы получить список всех первых строк).

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

Аннемике Смет
источник
1
Поскольку вы являетесь пользователем с репутацией 6: Если вам помог какой-либо из приведенных ниже ответов, не забудьте нажать на серый слева от его текста, что означает « Да», этот ответ действителен ! ;-)
Fabby

Ответы:

21

Используйте head:

head -n1 -q *.txt > new-file
  • -n1говорит headизвлечь только первую строку.
  • -q говорит голове не печатать имя файла.
choroba
источник
9

Использование grep:

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

grepбудет соответствовать любому символу и выйдет после первого совпадения, т.е. grepвыведет первые строки всех входных файлов, и мы сохраним их в out.txt.

heemayl
источник
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
кос
источник
Кос, немного долго, но здесь +1 ..
Heemayl
@heemayl Но это только для Bash. ;)
Кос
1
Кстати, поздравляю с 15k :)
heemayl
1
@heemayl Спасибо: D. Честно говоря, я проверяю сайт как сумасшедший только ради защиты вопроса XD
kos
0

Вы пробовали это awk, вот awkверсия

awk 'FNR==1 {print} {nextfile}' *.txt > out
AB
источник
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 

И perl:

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в конце этих команд.

Сергей Колодяжный
источник