python - 要实现的场景,认为awk最适合这种情况

标签 python linux shell awk

我有以下我需要的场景。

我有两个非常大的文件,其中行数为千万行,并且没有。每个文件中的行数相同。 我认为 awk 是一个有用的工具,我可以用它连接两个文件并加入一些条件。请提出建议。

File1
# header1, header2, header3, header4
1,2,3,4
11,12,13,14
21,22,23,24
31,32,33,34
41,42,43,44

File2
a   d  e  f
a   f  g  h
b   p  q
33  b  p  q
43  b  x  y

Final Output
1, 2, 3, 4, a, d, e, f
11, 12, 13, 14, a, f, g, h
21, 22, 23, 24, b, p, q
31, 32, 33, 34, b, p, q
41, 42, 43, 44, b, x, y

file1、file2之间实际上是有联系的。从file1的每一行收集很少的 header ,并基于一些小工具生成file2。因此,对于 file1 中的每一行,file2 的同一行中都有一些信息。 现在我想加入这两个文件,如下逻辑。

file2 的第一个条目包含“a”、“b”或 file1 的 header 3 在此基础上,如果它包含 'a' 或 'b',那么我们按“1, 2, 3, 4, a, d, e, f”的方式连接行

如果 file2 的条目具有 file1 的 header3,那么我们按原样加入“31, 32, 33, b, p, q”

所有字段都必须以逗号分隔。并且输出必须转储到其他文件中。

我也可以在 python 中做同样的事情,但是 for 循环处理需要太多时间,因为文件太大,并且涉及很多 python 解释时间。所以我认为 awk 会是完成此类任务的更好实用程序。

请提出建议。谢谢。

最佳答案

基本思想应该是使用 paste 将各行连接在一起,然后使用 awk 纠正重复的 header 。

我假设 file2 具有制表符分隔的字段。尝试这个管道:

grep -v '^#' file1.csv \
| tr ',' '\t' \
| paste - file2.tsv \
| awk -v OFS="," '
    $3==$5 { print $1,$2,$3,$4,$6,$7,$8; next } 
    { $1=$1; print }'

根据提供的示例数据,将产生:

1,2,3,4,a,d,e,f
11,12,13,14,a,f,g,h
21,22,23,24,b,p,q
31,32,33,34,b,p,q
41,42,43,44,b,x,y

关于python - 要实现的场景,认为awk最适合这种情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10206431/

相关文章:

python - 如何在不重新安装模块的情况下更新 mac python

linux - gcc 4.8.2 在 CentOS 6 上出错

bash - 在awk中转换日期格式,行包含2个日期和一个ip

shell - sed : Save output and replace

linux - 使用相同的配置和构建实现多个 jenkins

python - 如何进入 Python 虚拟环境并从 shell 脚本在其中运行 shell 命令?

python - 如何在 x 分钟后暂停该线程

python - 如何获得在 iPython Notebook 示例中经常看到的现代风格的 matplotlib 图?

python - 你能帮我用这个筛子生成更大的素数吗?

c++ - 条件变量等待抛出异常