Как экспортировать несколько выводов 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

Другие вопросы по тегам