Как экспортировать несколько выводов grep в один файл?
У меня есть небольшая командная строка grep, которая находит определенные значения в текстовом файле и экспортирует их в .csv-file
,
Вот:
cat file.txt | grep 'Values a' | cut -d' ' -f9 >a.csv
cat file.txt | grep 'Values b' | cut -d' ' -f9 >b.csv
cat file.txt | grep 'Values c' | cut -d' ' -f9 >c.csv
cat file.txt | grep 'Values d' | cut -d' ' -f9 >d.csv
Как я могу изменить команды, чтобы получить одну (через запятую) .csv-file
с четырьмя столбцами a, b, c, d?
Любая помощь приветствуется!
2 ответа
Как было сказано в первом комментарии, без просмотра вашего файла file.txt сложно понять, правильно ли мы это понимаем.
Первая мысль была: почему бы тебе не пойти по легкой дороге? >> добавится, поэтому создайте одну вещь, добавьте остальные.
cat file.txt | grep 'Values a' | cut -d' ' -f9 > a.csv
cat file.txt | grep 'Values b' | cut -d' ' -f9 >> a.csv
cat file.txt | grep 'Values c' | cut -d' ' -f9 >> a.csv
cat file.txt | grep 'Values d' | cut -d' ' -f9 >> a.csv
Тогда я задавался вопросом, почему вы запускаете кошку вообще
grep 'Values a' file.txt | cut -d' ' -f9 > a.csv
grep 'Values b' file.txt | cut -d' ' -f9 >> a.csv
grep 'Values c' file.txt | cut -d' ' -f9 >> a.csv
grep 'Values d' file.txt | cut -d' ' -f9 >> a.csv
Это работает, но это ставит 4 вещи в новые строки, а не в виде значений, разделенных запятыми.
Поэтому я сконцентрировался на том, чтобы не вставлять новые строки и вместо этого получать запятую. awk может справиться с этим.
grep 'Values a' file.txt | cut -d' ' -f9 | awk '{printf $0 ","}' > a.csv
grep 'Values b' file.txt | cut -d' ' -f9 | awk '{printf $0 ","}' >> a.csv
и так далее. Это работает, но прямо перед тем, как я нажму "отправить", я понял, что следую за тобой, используя рубить, и нам это не нужно. awk может выбрать 9-ую вещь.
grep 'Values a' file.txt | awk '{printf $9 ","}' > a.csv
grep 'Values b' file.txt | awk '{printf $9 ","}' >> a.csv
Это сработало на небольшом тестовом примере, который я сделал, возможно, не на вашем тестовом примере.
Если бы я делал повторные операции с данными для создания файла, я бы предпочел хранить его в отдельных строках, а не в большом сложном клубке, как рекомендовалось другим. Так что я не думаю, что я бы пошел на один лайнер, четыре строки, которые я могу понять, достаточно хороши.
Если вы собираетесь делать больше работы с оболочкой, как это, я предлагаю вам получить копию старой книги Unix Power Tools. У этого есть много уловок как это.
Вы могли бы использовать paste
paste -d, {a..d}.csv > all.csv
или (пропуск промежуточных файлов с использованием процесса подстановки)
paste -d, <(grep 'Values a' file.txt | cut -d' ' -f9) <(grep 'Values b' file.txt | cut -d' ' -f9) <(grep 'Values c' file.txt | cut -d' ' -f9) <(grep 'Values d' file.txt | cut -d' ' -f9)
Вероятно, есть более эффективные и элегантные способы сделать то, что вы хотите, которые не включают в себя несколько проходов одного и того же файла - но вам нужно будет поделиться примером, который отображает формат вашего file.txt