要实施的场景,认为awk是这种情况的最佳选择

时间:2012-04-18 09:20:28

标签: python linux shell awk

我有以下需要的场景。

我有两个非常大的文件,其中包含crores,而no。每个文件中的行是相同的。 我认为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的每一行收集的标题很少,并且基于一些小工具file2生成。因此,对于file1中的每一行,file2的同一行中都有一些信息。 现在我想加入这两个文件,如下面的逻辑。

file2的第一个条目包含file1的'a','b'或标题3 基于此,如果它包含'a'或'b',那么我们按“1,2,3,4,a,d,e,f”

加入这些行

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

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

我也可以在python中做同样的事情,但是在循环处理中花费太多时间,因为文件太大了,并且有很多python解释时间涉及..所以我觉得awk会更好用做这样的任务。

请建议。感谢。

2 个答案:

答案 0 :(得分:1)

基本思路应该是将这些行与paste一起加入,然后使用awk更正重复的标题。

我假设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

答案 1 :(得分:1)

paste -d, <(tail -n+2 File1) <(awk -vOFS=, '
{
    $1 = ($1 !~ /^(a|b)$/) ? "" : $1
}1' File2) | tr -s ,

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
  • paste <(commandA)&lt;(commandB)会将两个流程的输出结合在一起;
  • 我在cond ? YES : NO命令中使用 awk 而不是 if...else... ;
  • tr -s 会将,,翻译为,