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

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

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

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

13
задан 23 November 2015 в 07:32

5 ответов

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

head -n1 -q *.txt > new-file
  • -n1 говорит head извлекать первую строку только.
  • -q говорит голове не печатать имя файла.
21
ответ дан 23 November 2019 в 03:13

Используя grep:

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

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

8
ответ дан 23 November 2019 в 03:13

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

awk 'FNR==1 {print} {nextfile}' *.txt > out
0
ответ дан 23 November 2019 в 03:13

Другой подход с 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 в конце этих команд.

0
ответ дан 23 November 2019 в 03:13

Только Используя 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
2
ответ дан 23 November 2019 в 03:13

Другие вопросы по тегам:

Похожие вопросы: