Есть ли способ получить список имен файлов и первой строки текста в той же строке в Linux? - PullRequest
0 голосов
/ 29 марта 2019

Я пытаюсь получить список имен файлов в каталоге и первую строку текста из каждого файла и вывести каждую пару в одну строку для вывода в файл .csv.

Я испробовал несколько различных методов использования head, ls, find и grep и их комбинаций, но, похоже, результаты не отображаются в одной строке. Самым близким, что я получил, было заставить их печатать на отдельных строках.

Вот пример вывода, который мне нужен:

filename1.txt "this is the first line of text"
filename2.txt "this is the first line of text"

Меня не очень интересует наличие дополнительных символов или чего-либо еще в результатах, так как я могу легко отредактировать это в Excel, когда они будут в одной строке.

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

2 голосов
/ 29 марта 2019

Чтобы получить имена файлов и первые строки для всех файлов в каталоге, попробуйте:

awk '{print FILENAME" \"" $0"\""; nextfile}' *

Чтобы получить имена файлов и первые строки для всех файлов, имена которых начинаются с 328, попробуйте:

awk '{print FILENAME" \"" $0"\""; nextfile}' 328*

Пример

Рассмотрим каталог с этими двумя файлами:

$ cat filename1.txt
this is the first line of text
2
3
$ cat filename2.txt
this is the first line of text
b
c

Теперь запустите нашу команду:

$ awk '{print FILENAME" \"" $0"\""; nextfile}' *
filename1.txt "this is the first line of text"
filename2.txt "this is the first line of text"

Как это работает

  • `awk '{...}' *

    Запускает awk и запускает команды внутри фигурных скобок.С глобусом * это выполняется для всех файлов.Глобус может быть ограничен, например, 328*.txt для работы со всеми файлами, имена которых начинаются с 328 и заканчиваются .txt.

    По умолчанию awk будет читать по одной строке за раз для каждогофайл по очереди.

  • print FILENAME" \"" $0"\""

    Это говорит awk о необходимости напечатать имя файла, за которым следует ", за которым следует первая строка, $0, за которой следует еще один".

  • nextfile

    Поскольку мы не заинтересованы в чтении второй строки, это говорит awk, чтобы перейти к следующему файлу.

Сохранение в файл

Мы можем сохранить первые строки в файл следующим образом:

$ awk '{print FILENAME" \"" $0"\""; nextfile}' *.txt >output.txt

Файл output.txt выглядит следующим образом:

$ cat output.txt
filename1.txt "this is the first line of text"
filename2.txt "this is the first line of text"
1 голос
/ 29 марта 2019

Если я правильно понимаю, что вы просите, это может сделать это

for i in *.*
do
   FL=`head -1 $i`
   echo "$i \"$FL\""
done

По вашему требованию вы можете попробовать это

OP_FILE="op.csv"
>$OP_FILE
for i in 328*.*
do
  FL=`head -1 $i`
  echo "$i \"$FL\"" >> $OP_FILE
done
...