【问题标题】:Scenario to be implemented, think awk is the best for such situation要实现的场景,认为 awk 最适合这种情况
【发布时间】:2012-04-18 09:20:27
【问题描述】:

我有以下我需要的场景。

我有两个非常大的文件,其中的行数以千万计,而没有。每个文件中的行数相同。 我认为 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 的第一个条目包含 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 会更好的实用程序做这样的任务。

请提出建议。谢谢。

【问题讨论】:

  • 你的描述对我来说似乎有点(很多)令人困惑。首先你说两个文件都是逗号分隔的,但你的 file2 不是。而且,以千万为单位,你的意思是大量?(不得不向上看)。更重要的是,我是否正确地说,标题 1、标题 2 等是指数字 1、2、3、4 或 11、12、13、14 等?
  • Yes 正确... File1 包含一行,其中包含每个条目的其余行的标题。
  • 所以,file1的line2对应file2的line1,file1的line3对应file2的line2,以此类推。我们必须按照上述条件加入。如果有任何其他疑问,请告诉我。
  • 是的,这两个文件都非常大,所以为了通过 pythonic 循环处理每个文件,然后创建一个逻辑来加入文件似乎非常耗时.. 所以我去 awk 寻找更好的选择,并认为它会花费更少的时间..!!
  • 你能贴出你正在使用的python代码吗?

标签: python linux shell awk


【解决方案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

【讨论】:

  • 请解释一下这个命令,因为我不太了解 awk 实用程序。
【解决方案2】:
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 &lt;(commandA) 将两个进程的输出组合在一起;
  • 我在 awk 命令中使用 cond ? YES : NO 而不是 if...else...;
  • tr -s 会将,, 转换为,

【讨论】:

  • 请解释一下这个命令。我知道 awk 和 paste 实用程序。谢谢。
  • 我对 awk 和 paste 实用程序知之甚少。 :-(
  • 这给出了不正确的输出......你的 if/else 事情奏效了。
  • 请解释您的逻辑,因为我对 awk 实用程序知之甚少。
猜你喜欢
  • 2016-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-19
  • 2011-06-30
  • 2012-01-21
  • 1970-01-01
相关资源
最近更新 更多