标签: awk

关联数组:Python vs Perl vs Awk 性能

我正在处理具有约 4 亿行和 3 列的文件。前两列是字母数字字符串,而最后一列是数字。像这样的东西:

NM_001011874.1,NM_011441.4,-0.131672299779153
Run Code Online (Sandbox Code Playgroud)

我有多个这样的文件,它们的行数和 3 列数大致相同。这些不一定基于 3 列中的任何一列进行排序。我正在尝试根据前两列的组合来组合这些文件。例如:

File 1

NM_001011874.1,XR_104537.1,-0.929524370261122
NM_001011874.1,XM_003084433.1,-0.603098764428879

File 2

NM_001011874.1,XR_104537.1,-0.11254525414
NM_001011874.1,NM_005040.1,-0.20509876488

File 3

NM_001011874.1,XR_104537.1,-0.41254525414
NM_001011874.1,NM_005040.1,-0.60509876488
Run Code Online (Sandbox Code Playgroud)

我想要做的是通过使用前两列中的值组合来创建一个键,然后从该对的第三列中检索相应的值。我得到的最终输出是:

Output2 

NM_001011874.1,XR_104537.1,-0.11254525414,-0.929524370261122,-0.41254525414
NM_001011874.1,NM_005040.1,-0.20509876488,,-0.60509876488
Run Code Online (Sandbox Code Playgroud)

我正在使用 awk 执行上述操作:

awk -F',' 'NR==FNR{a[$1,$2]=$3;next}{$4=a[$1,$2];print}' OFS=',' file1.txt file2.txt
Run Code Online (Sandbox Code Playgroud)

我为任务分配了 256GB。使用上述命令通过组合两个文件来生成输出大约需要 90 分钟,其中每个文件有大约 4 亿行和 3 列。输出文件再次有大约 4 亿行但有 4 列。每添加一列,生成输出文件所花费的时间就会增加。

我是按顺序进行的,即合并 file1 和 file2 以生成具有 4 列的 output1。然后合并 file3 和 output1 以生成具有 5 列的 output2,然后将 file4 和 output2 合并以生成具有 6 列的 output3,依此类推,直到我得到具有 22 列的最终输出。

我想知道在 Python 或 Perl 中执行此操作在速度和自动化方面是否更有效?我有大约 20 个这样的文件,每个文件有 3 …

python perl performance awk

-3
推荐指数
1
解决办法
1870
查看次数

AWK:从LS获取文件名

我有一个文件名列表(名称加扩展名),我只想提取不带扩展名的名称。

我在用着

ls -l | awk '{print $9}' 
Run Code Online (Sandbox Code Playgroud)

列出文件名,然后

ls -l | awk '{print $9}' | awk /(.+?)(\.[^.]*$|$)/'{print $1}'
Run Code Online (Sandbox Code Playgroud)

但我在转义时遇到错误(

-bash: syntax error near unexpected token `('
Run Code Online (Sandbox Code Playgroud)

隔离名称的正则表达式(.+?)(\.[^.]*$|$)有一个捕获组,我认为它是正确的,但我不知道它在 awk 语法中不起作用。

ABCDEF.ext我的文件列表在根文件夹中是这样的。

regex awk

-3
推荐指数
1
解决办法
7079
查看次数

使用 awk 或 jq 获取 json 值

我的 json 文件看起来像这样。

我有超过 5000 个文件:文件名:xxxx.json

示例文件1000.json

[
  {
    "gender": {
      "value": "Female"
    },
    "age": 38.58685,
    "age_group": "adult"
  },
  {
    "gender": {
      "value": "Male"
    },
    "age": 26.64953,
    "age_group": "adult"
  }
]
Run Code Online (Sandbox Code Playgroud)

示例文件2000.json

[
  {
    "gender": {
      "value": "Male"
    },
    "age": 63.8272,
    "age_group": "adult"
  },
  {
    "gender": {
      "value": "Male"
    },
    "age": 11.8287,
    "age_group": "child"
  }
]
Run Code Online (Sandbox Code Playgroud)

一个文件output.txt 中的所需输出

1000 & Female,Male & 38,26 & adult,adult
2000 & Male,Male & 63,11 & adult,child

awk json jq

-3
推荐指数
1
解决办法
189
查看次数

Bash 命令首先显示给定日期中最早的日期,然后显示最年轻的日期

显示最年轻和最老日期的命令是什么样的?输入是默认给出的,因此它应该是不使用文件目录的输入。例如:

1910-04-21
2015-03-05
1930-01-23
1908-06-02
2015-07-13
Run Code Online (Sandbox Code Playgroud)

结果应该是:

1908-06-02
2015-07-13
Run Code Online (Sandbox Code Playgroud)

我尝试使用AWK来实现它,但是我该如何编写呢?

bash awk

-3
推荐指数
1
解决办法
137
查看次数

如何:在Bash中转换标题案例规则之后的文本

如何在遵循规则的同时将字符串转换为标题大小写,而不仅仅是简单地将单词的每个首字母大写?

示例规则:

  • 将所有单词大写,但以下情况除外:
  • 小写所有文章(a,the),介词(to,at,in,with)和协调连词(和,但是,或)
  • 无论词性如何,都可以将标题中的第一个和最后一个词大写

在bash中执行此操作的任何简单方法?单行赞赏.

(正如另外一点,这是用于parcellite行动.)

string bash awk sed tr

-4
推荐指数
1
解决办法
1986
查看次数

使用awk操作文件的输出

我有unix文件

a,b,c,d
e,f,g,h
u,v,x,y
Run Code Online (Sandbox Code Playgroud)

我想分开打印第一个col和其他所有col

a,b
a,c
a,d
e,f
e,g
e,h
Run Code Online (Sandbox Code Playgroud)

等等

提前致谢

unix shell awk

-5
推荐指数
1
解决办法
82
查看次数

Bash- awk one liner {打印文本文件的每三行}

所以,我正在尝试显示/打印文件的每三行.

所以它会是这样的

    third line



    sixth line 



    ninth line 




    twelfth line.
Run Code Online (Sandbox Code Playgroud)

它必须是一行awk命令.

bash awk

-6
推荐指数
1
解决办法
931
查看次数

每行输出小计,同时加上数字,每行一个

例如,我有一个看起来像这样的文件:

2
4
7
-3
5
-2
Run Code Online (Sandbox Code Playgroud)

我需要输出看起来像这样:

2
6
13
10
15
13
Run Code Online (Sandbox Code Playgroud)

bash shell perl awk sed

-6
推荐指数
1
解决办法
91
查看次数

命令"打印所有行开头"

我正在寻找一个perl命令,其中打印以字符串开头的行.例如,如果我想打印以"1234"开头的所有行,该命令会是什么样的?桑达?AWK?grep的?

unix perl awk command sed

-7
推荐指数
1
解决办法
2124
查看次数

为什么不在perl中使用awk?

可能这个问题多次被问到能否在你的perl脚本中加入awk one liner.但是这些问题对于以下问题过于具体:

  1. 提供了一种不同的方法作为建议或
  2. 现有代码中的语法已被纠正OR
  3. 大多数时候 - >解决方案是使用perl提供的,因为专家喜欢使用awk或perl,因为他们都做同样的工作.是.也许.但我认为awk是针对特定问题而设计的,这些问题可以在awk中比perl更好地解决.

示例:我有输出,ls -lart第9列是文件名.我很容易在awk中做到这一点ls -lart|awk '{print $9}'.同样的事情当然可以使用perl来完成readdir().但是在perl中提取第8列或第7列并不容易?如果我必须提取数据管道将其管道输送到sed等,情况会变得更糟.

另一个例子: 我有一个特定的DIR,它有许多格式的文件,如:

ABC_9090_DEF_10-22-30_13-07-2014.temp
Run Code Online (Sandbox Code Playgroud)

注意date_time.temp标记部分.这里的格式是ABC_4digits_DEF_hours-minutes-seconds_day-month-year

我想只看到刚刚创建的新文件(比如说从现在起5分钟之前).使用awk/sed的方法是(伪代码,让我知道你是否需要我复制实际的一个班轮):

  1. ls -lart|awk '{print $9}'|
  2. egrep 提取10-22-30_13-07-2014
  3. 使用sed替换_ with - | awk重新排列以具有YEARMONTHDAYHOURSMINUTESSECONDS格式的数字.
  4. 使用awk再次比较这个数字使用if($ 1> $ mynum)对变量(假设有一个相同格式的数字代表TODAYS TIME - 5分钟)

问题: 但由于某种原因(其他复杂性)我想在perl中编写它并且我发现当使用系统命令在perl中使用它时,if条件if($ 1> $ mynum)会抛出错误.它说使用'>'语法错误,即使使用单引号,双引号,没有引号.

有人可以告诉我一般情况:

  1. 如果给出选择,为什么有人不会在这种情况下使用awk,sed而不是perl?
  2. 在perl中包含awk或sed时应该记住的事情的一般解释不是特定于这个问题(希望也应该解决这个特定的问题).

regex perl awk sed

-9
推荐指数
1
解决办法
248
查看次数

如何将一个文件中的值与另一个文件中的值匹配?

有两个输入文件,如下面的行所示.

列3和4 input1保持一个范围(例如,178第一行中)

第2列input2保持单个位置值(例如32在第一行中),其对应于列中的一个范围input1,以及第2 列中的对应值:在这种情况下B100002.

我想为文件的第2列中的每个值生成一个文件,其中包含相对于范围起点的位置 input1

例如,358-344 + 1 = 15是相对位置值 B100043

输入1:

Scaffold_1      B100002        1       78
Scaffold_1      B100041        179     243
Scaffold_1      B100043        344     418
Scaffold_1      B100045        519     583
Scaffold_1      B100058        684     751
Scaffold_1      B100059        852     915
Scaffold_1      B100066        1016    1079
Scaffold_1      B100080        1180    1246
Scaffold_1      B100111        1347    1413
Scaffold_1      B100118        1514    1585
Scaffold_2      B123465        31531   31595
Run Code Online (Sandbox Code Playgroud)

输入2:

Scaffold_1      32
Scaffold_1      358
Scaffold_2      31533
Run Code Online (Sandbox Code Playgroud)

所需输出:

B100002 …
Run Code Online (Sandbox Code Playgroud)

perl awk

-26
推荐指数
1
解决办法
383
查看次数

标签 统计

awk ×11

perl ×5

bash ×4

sed ×4

regex ×2

shell ×2

unix ×2

command ×1

jq ×1

json ×1

performance ×1

python ×1

string ×1

tr ×1