我有个问题。我的输入文件由两列组成。在第一列中,我有MGD(和一些值),比如MGD5、MGD19;在第二列中,我有SOL,还有一些值,比如SOL2、SOL41,在第二列中,我有3倍的SOL重复,所以在我的文件中有3行,其中SOL和MGD1 SOL41是一样的,后来我有MGD15 SOL41和后来的MGD68 SOL41。我想要两笔钱。“内”和“外”,但你是以一种特定的方式计算的。
( a)第一个条件:如果在所有三行中,我在$1和$2中都有相同的值,则在“内部”加上3,在“外部”中添加零。
MGD17 SOL72
MGD17 SOL72
MGD17 SOL72( b)第二个条件是两个相同的数值,以$1为单位,但以一个不同的$1,当然在$2中相同,而我在“内部”加上1个,在“外部”加上2个,例如:
MGD17 SOL115
MGD51 SOL115
MGD51 SOL115( c)第三个条件在$1中不同,在$2中相同,因此我将其添加到“内部”0和“外部”3中
MGD17 SOL4
MGD51 SOL4
MGD98 SOL4输入示例
MGD24 SOL6215
MGD25 SOL6215
MGD26 SOL7
MGD26 SOL7
MGD27 SOL93
MGD27 SOL93
MGD27 SOL93
MGD28 SOL7
MGD28 SOL6215预期输出(第一列为内部,第二列为外部)
4 5为什么是这个输出?内3,外0
MGD27 SOL93
MGD27 SOL93
MGD27 SOL93这里1内2外
MGD26 SOL7
MGD26 SOL7
...
MGD28 SOL7这里0内3外
MGD24 SOL6215
MGD25 SOL6215
...
MGD28 SOL6215我试着写剧本。我会在100个文件上这样做。我坚持这些条件,我不知道如何在代码中实现它们。我知道我应该处理这个文件两次,在第二次比较我的值。
#!/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个文件。
#!/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脚本的完整解释
MGD24 SOL6215
MGD25 SOL6215
MGD26 SOL7
MGD26 SOL7
MGD27 SOL93
MGD27 SOL93
MGD27 SOL93
MGD28 SOL7
MGD28 SOL6215 sort -k2,2 -k1,1 file >> output.txt所以当我们运行脚本时,我们得到了这个
MGD24 SOL6215
MGD25 SOL6215
MGD28 SOL6215
MGD26 SOL7
MGD26 SOL7
MGD28 SOL7
MGD27 SOL93
MGD27 SOL93
MGD27 SOL93然后,我们计算相同的行数,在第一列中写入重复的行数,只留下唯一的行()。
sort -k2,2 -k1,1 file |
uniq -c >> output.txt 我们的产出
1 MGD24 SOL6215
1 MGD25 SOL6215
1 MGD28 SOL6215
2 MGD26 SOL7
1 MGD28 SOL7
3 MGD27 SOL93然后,我们计算第二列的重复次数,在第一列中写入重复次数,然后用SOL
删除行。
sort -k2,2 -k1,1 eq9_x3_1.ndx |
uniq -c |
uniq -f2 -c >> output.txt我们的产出
3 1 MGD24 SOL6215
2 2 MGD26 SOL7
1 3 MGD27 SOL93然后,,
。
发布于 2021-01-23 21:33:22
$ 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解释只是一个练习..。
https://stackoverflow.com/questions/65862342
复制相似问题