У меня есть каталог с несколькими .txt
файлы.
Из каждого из этих файлов я хочу выбрать первую строку и распечатать его в новое .txt
файл (для получения списка всех первых строк).
Я попробовал его awk
и sed
команды и объединенный это с циклом, но без успеха.
Используйте head
:
head -n1 -q *.txt > new-file
-n1
говорит head
извлекать первую строку только. -q
говорит голове не печатать имя файла. Используя grep
:
grep -m 1 '.' *.txt >output.file
grep
будет соответствовать любому символу и выйдет после того, как первое соответствие т.е. grep
произведет первые строки всех входных файлов, и мы сохраняем тех, которые в out.txt
.
Вы попробовали его awk
, вот awk
версия
awk 'FNR==1 {print} {nextfile}' *.txt > out
Другой подход с 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
в конце этих команд.
Только Используя 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