如何将多个 grep 输出导出到一个文件中?

如何将多个 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 的命令(逗号分隔)?
任何帮助都非常感谢!

答案1

正如第一条评论所说,如果看不到您的“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

然后我想知道你为什么要运行 cat

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

等等。这样就行了,但就在我点击“发送”之前,我意识到我正在跟着你使用 cut,但我们不需要。awk 可以选择第 9 个东西。

grep 'Values a' file.txt | awk '{printf $9 ","}' > a.csv
grep 'Values b' file.txt | awk '{printf $9 ","}' >> a.csv

这对我制作的一个小测试用例有效,但可能对您的测试用例无效。

如果我要反复对数据进行 grep 以构建文件,我可能更愿意将其保存在单独的行中,而不是像另一个建议的那样将其保存在一大堆复杂的乱麻中。因此,我认为我不会选择一行,我能理解的四行就足够了。

如果你打算做更多这样的 shell 工作,我建议你买一本老书《Unix Power Tools》。它有很多这样的技巧。

答案2

你可以使用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

相关内容