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


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

Кос, немного долго, но здесь +1 ..
Heemayl

@heemayl Но это только для Bash. ;)
Кос

1
Кстати, поздравляю с 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 

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.