首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计数取决于awk中列中的值。

计数取决于awk中列中的值。
EN

Stack Overflow用户
提问于 2021-01-23 17:37:42
回答 1查看 158关注 0票数 0

我有个问题。我的输入文件由两列组成。在第一列中,我有MGD(和一些值),比如MGD5、MGD19;在第二列中,我有SOL,还有一些值,比如SOL2、SOL41,在第二列中,我有3倍的SOL重复,所以在我的文件中有3行,其中SOL和MGD1 SOL41是一样的,后来我有MGD15 SOL41和后来的MGD68 SOL41。我想要两笔钱。“内”和“外”,但你是以一种特定的方式计算的。

( a)第一个条件:如果在所有三行中,我在$1和$2中都有相同的值,则在“内部”加上3,在“外部”中添加零。

代码语言:javascript
复制
MGD17  SOL72
MGD17  SOL72
MGD17  SOL72

( b)第二个条件是两个相同的数值,以$1为单位,但以一个不同的$1,当然在$2中相同,而我在“内部”加上1个,在“外部”加上2个,例如:

代码语言:javascript
复制
MGD17  SOL115
MGD51  SOL115
MGD51  SOL115

( c)第三个条件在$1中不同,在$2中相同,因此我将其添加到“内部”0和“外部”3中

代码语言:javascript
复制
MGD17  SOL4
MGD51  SOL4
MGD98  SOL4

输入示例

代码语言:javascript
复制
MGD24 SOL6215
MGD25 SOL6215
MGD26 SOL7
MGD26 SOL7
MGD27 SOL93
MGD27 SOL93
MGD27 SOL93
MGD28 SOL7
MGD28 SOL6215

预期输出(第一列为内部,第二列为外部)

代码语言:javascript
复制
4   5

为什么是这个输出?内3,外0

代码语言:javascript
复制
MGD27 SOL93
MGD27 SOL93
MGD27 SOL93

这里1内2外

代码语言:javascript
复制
MGD26 SOL7
MGD26 SOL7
...
MGD28 SOL7

这里0内3外

代码语言:javascript
复制
MGD24 SOL6215
MGD25 SOL6215
...
MGD28 SOL6215

我试着写剧本。我会在100个文件上这样做。我坚持这些条件,我不知道如何在代码中实现它们。我知道我应该处理这个文件两次,在第二次比较我的值。

代码语言:javascript
复制
#!/bin/bash
for index in {1..100} # I do this script on 100 files, that is s why I use for loop
do
    awk 'NR==FNR         {a[$1,$2]++; s[$1,$2]++; next} 

how to write these conditions????
       END             {print inner,outer}' eq9_$index.ndx{,} >> inner_outer_water_bridges_x2.txt
done

你有什么想法吗?

这就是答案-我修改了我的脚本来处理100个文件。

代码语言:javascript
复制
#!/bin/bash
for index in {1..100} # I do this script on 100 files, that is s why I use for loop
do
    sort -k2,2 -k1,1 eq9_x3_$index.ndx | 
    uniq -c             | 
    uniq -f2 -c         | 
    awk '$1>1{outer+=$1} $1<3{inner+=5-2*$1} END{print inner, outer}' >> inner_outer_water_bridges_x3.txt
done

我在输入数据下面写了@karakfa脚本的完整解释

代码语言:javascript
复制
MGD24 SOL6215
MGD25 SOL6215
MGD26 SOL7
MGD26 SOL7
MGD27 SOL93
MGD27 SOL93
MGD27 SOL93
MGD28 SOL7
MGD28 SOL6215

  1. 首先对我们的值进行排序。主键在第二列,第二键在第一列。

代码语言:javascript
复制
    sort -k2,2 -k1,1 file >> output.txt

所以当我们运行脚本时,我们得到了这个

代码语言:javascript
复制
MGD24 SOL6215
MGD25 SOL6215
MGD28 SOL6215
MGD26 SOL7
MGD26 SOL7
MGD28 SOL7
MGD27 SOL93
MGD27 SOL93
MGD27 SOL93

然后,我们计算相同的行数,在第一列中写入重复的行数,只留下唯一的行()。

代码语言:javascript
复制
    sort -k2,2 -k1,1 file | 
    uniq -c  >> output.txt 

我们的产出

代码语言:javascript
复制
      1 MGD24 SOL6215
      1 MGD25 SOL6215
      1 MGD28 SOL6215
      2 MGD26 SOL7
      1 MGD28 SOL7
      3 MGD27 SOL93

然后,我们计算第二列的重复次数,在第一列中写入重复次数,然后用SOL

删除行。

代码语言:javascript
复制
    sort -k2,2 -k1,1 eq9_x3_1.ndx | 
    uniq -c             | 
    uniq -f2 -c          >> output.txt

我们的产出

代码语言:javascript
复制
      3       1 MGD24 SOL6215
      2       2 MGD26 SOL7
      1       3 MGD27 SOL93

然后,,

  1. ,我们计算了这个值。当我们在第一列值大于1时,我们将第一列的值加到外部值(因此,在我们的日期中,我们从第一行加3,第一列加2,从第二行第一列加上2,所以我们的外部: 3+2 = 5。然后我们再次检查第一列的值,如果第一列的值低于3,那么对于第二行第一列,我们有5-2_2 = 1,对于第三行,第一列是: 5-2_1 =3,我们的内部:1+3 =4

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-23 21:33:22

代码语言:javascript
复制
$ sort -k2 -k1,1 file | 
  uniq -c             | 
  uniq -f2 -c         | 
  awk '$1>1{outer+=$1} $1<3{inner+=5-2*$1} END{print inner, outer}'


4 5

解释只是一个练习..。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65862342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档