@quintera

Как в Linux вывести данные из файлов и записать построчно?

В системе Linux есть миллионы файлов со следующим содержимым:
id: 123456789012 #числа в каждом файле разные но всегда состоят из 12 цифр
x=123 y=1234 #здесь тоже числа разные, могут состоять максимум из 4 цифр
Laterality=R #здесь во всех файлах значение либо R либо L

нужно вывести только значения и записать построчно, как на примере:
123456789012 123 1234 R
234567890123 2345 234 L
и т.д.

с помощью этой команды я смог вывести и записать построчно только значения id в txt-файл со всех файлов в каталоге и в подкаталогах:
6389b5a4a5c07907134557.jpeg

получилось так:
123456789012
234567890123
и т.д.

у меня не получается придумать команду с условием, что если в файле нет строк с "x=" либо "y=" либо "Laterality", то ничего с этого файла записывать не нужно, а если в файле все строки имеются то записать их значения (значения из одного файла в одну строку, разделив пробелом как указал на примере "123456789012 123 1234 R")
  • Вопрос задан
  • 418 просмотров
Пригласить эксперта
Ответы на вопрос 4
trapwalker
@trapwalker
Программист, энтузиаст
Выглядит так, будто бы вам для решения достаочно тривиального однострочника на питоне, запускаемого в виде кманды py. Опишите более внятно формат входных данных, как именются файлы и в каких структурах каталогов они размещены.
Результат надо в один файл слить?
Общая схема такая:
- итерируемся по фходящим файлам с помощью glob или walk (если файлы в дереве каталогов, а не в одном каталоге).
- преобразуем содержимое файла в словарь: обычно достаточно сплита текста по пробелам и абзацам, потом сплит по "=" и получаем аргумент для конструктора словаря.
- печатаем в stdout f-строку с одстановкой данных из словаря, плученного выше.

Это если я правильно понял ваше сумбурное описание задачи.

UPD. Автор в изначальном вопросе не дал понять. что формат файла бинарный.
Решение на системных утилитах командной стоки будет громоздким и неремонтопригодным в плане поддержки.
Нужно на питоне делать. Если id гарантировано 12 цифр и такая последовательность встречется только в виде id, то можно парсить и регекспами.
Но сдаётся мне не просто вам будет, если не умеете в питон.
Ответ написан
Комментировать
CityCat4
@CityCat4
//COPY01 EXEC PGM=IEBGENER
Написать скриптец на баше.
По каждому файлу
- грепнули ID:, распарсили строку
- грепнули x=, распарсили строку
- грепнули Laterality, распарсили строку
Если после грепа не получили ничего (то есть в файле нет строки), оборот цикла и читать следующий файл

Код писать лениво, но скрипт там небольшой. Если система хранения с подкаталогами, можно его рекурсивно вызывать :)
Ответ написан
shambler81
@shambler81 Куратор тега Linux
1. Братан я тебе ответ тоже дам скриншотом, ок ?
2. Будь добр хотябы на скриншоте не 123 а те цифры что реально выбрал из того кода что ты показал, и так приходится разбираться в том что ты понаписал в добавок еще и магически думать чего тебе нужно.
3. https://regex101.com/r/9gPiRY/11 будь другом закинь сюда все что у тебя есть

Вначале мы разберемся с регуляркой, а потом будем уже разбираться с grep.
Ответ написан
ValdikSS
@ValdikSS
Предполагается, что данные "id", "x=" и "Laterality" расположены именно в таком порядке.

find /home -type f -print0 | xargs -0 -n1 awk '/^id: / {id=$0} /^x=/ {x=$0} /Laterality=/ {print id, x, $0}'
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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