Создайте файл CSV, используя имя файла и его содержимое в Linux - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть папка с более чем 400 тыс. Текстовых файлов.

С такими именами, как

deID.RESUL_12433287659.txt_234323456.txt
deID.RESUL_34534563649.txt_345353567.txt
deID.RESUL_44235345636.txt_537967875.txt
deID.RESUL_35234663456.txt_423452545.txt

Каждый файл имеет различное содержимое

Я хочу получить имя файла и файлсодержимое и положить в CSV.

Что-то вроде:

file_name,file_content
deID.RESUL_12433287659.txt_234323456.txt,Content 1
deID.RESUL_34534563649.txt_345353567.txt,Content 2
deID.RESUL_44235345636.txt_537967875.txt,Content 3
deID.RESUL_35234663456.txt_423452545.txt,Content 4

Я знаю, как получить все файлы в каталоге в CSV, используя:

find * > files.csv

Как можноЯ тоже хватаю содержимое файла?

1 Ответ

0 голосов
/ 20 февраля 2019
  1. csv, как следует из названия, это запятая отдельный файл.Вы представили таблицу.
  2. find * несколько странно, find уже сканирует рекурсивно.find . достаточно, чтобы включить все find * (ну, если не учитывать какие-то странные правила оболочки, которые вы принимаете во внимание).
  3. Нам нужно будет перебирать файлы.Также было бы неплохо удалить переводы строк.

# create file for a MCVE
while IFS=' ' read -r file content; do echo "$content" > "$file"; done <<EOF
deID.RESUL_12433287659.txt_234323456.txt       Content 1
deID.RESUL_34534563649.txt_345353567.txt       Content 2
deID.RESUL_44235345636.txt_537967875.txt       Content 3
deID.RESUL_35234663456.txt_423452545.txt       Content 4
EOF

{ 
    # I'm using `|` as the separator for columns
    # output header names
    echo 'file_name|file_content';
    # this is the hearth of the script
    # find the files
    # for each file execute `sh -c 'printf "%s|%s\n" "$1" "$(<"$1")"' -- <filename>`
    # printf - nice printing
    # "$(<"$1")" - gets file content and also removes trailing empty newlines. Neat.
    find . -type f -name 'deID.*' -exec sh -c 'printf "%s|%s\n" "$1" "$(<"$1")"' -- {} \;
} |
# nice formatting:
column -t -s'|' -o '      '

выведет:

file_name                                       file_content
./deID.RESUL_44235345636.txt_537967875.txt      Content 3
./deID.RESUL_35234663456.txt_423452545.txt      Content 4
./deID.RESUL_34534563649.txt_345353567.txt      Content 2
./deID.RESUL_12433287659.txt_234323456.txt      Content 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...