使用 awk 计算复杂条件
Counting with a complicated conditions using awk
我有一个任务。我必须从数据中计算内部和外部水桥。我想告诉你我应该如何计算它们。
比如我有一个数据文件:
MGD12 SOL54
MGD14 SOL74
MGD10 SOL37
MGD16 SOL65
MGD21 SOL66
MGD2 SOL65
MGD64 SOL74
MGD10 SOL37
MGD72 SOL74
MGD12 SOL54
内水桥时:MGD和SOL相同(重复)。外水桥当:MGD不同,SOL相同
比如第三栏我写哪条线是内水桥哪条线是外水桥
1.MGD12 SOL54 inner (the same in line 10)
2.MGD14 SOL74 outer (the same SOL in 7, 9)
3.MGD10 SOL37 inner (the same in line 8)
4.MGD16 SOL65 outer (the same SOL in 6)
5.MGD21 SOL66 no water bridge
6.MGD2 SOL65 outer (the same SOL in 4)
7.MGD64 SOL74 outer (the same SOL in 2, 9)
8.MGD10 SOL37 inner (the same in line 3)
9.MGD72 SOL74 outer (the same SOL in 2, 7)
10.MGD12 SOL54 inner (the same in line 1)
在输出中,我只需要内部和外部水桥的数量。在这种情况下,它只会是数字 4 和 5。
4 5
我试着写一个脚本,但我不知道我应该在条件中放什么,也许我应该使用数组?
#!/bin/bash
awk '{ if () inner++; else if () outer++} END { print inner " " outer}' probe.txt
编辑,我尝试使用该脚本,但它不起作用
#!/bin/bash
awk 'NR==FNR {a[,]++; s[]++; next}
a[,]!=s[] {outer++; next}
s[]!=1 {inner++}
END {print inner,outer}' probe.txt | tee probe2.txt
输入
MGD12 SOL54
MGD14 SOL74
MGD10 SOL37
MGD16 SOL65
MGD21 SOL66
MGD2 SOL65
MGD64 SOL74
MGD10 SOL37
MGD72 SOL74
MGD12 SOL54
在输出中我有一个空行 (probe2.txt)
当我尝试另一个 scipt
#!/bin/bash
awk 'NR==FNR {a[,]++; s[]++; next}
{print [=17=], (a[,]==s[]?(s[]==1?"no":"inner"):"outer")}' probe.txt | tee probe2.txt
我的输出又是空的。
双扫描方法更容易...
$ awk 'NR==FNR {a[,]++; s[]++; next}
{print [=10=], (a[,]==s[]?(s[]==1?"no":"inner"):"outer")}' file{,}
MGD12 SOL54 inner
MGD14 SOL74 outer
MGD10 SOL37 inner
MGD16 SOL65 outer
MGD21 SOL66 no
MGD2 SOL65 outer
MGD64 SOL74 outer
MGD10 SOL37 inner
MGD72 SOL74 outer
MGD12 SOL54 inner
只是计数
$ awk 'NR==FNR {a[,]++; s[]++; next}
a[,]!=s[] {outer++; next}
s[]!=1 {inner++}
END {print inner,outer}' file{,}
4 5
我有一个任务。我必须从数据中计算内部和外部水桥。我想告诉你我应该如何计算它们。
比如我有一个数据文件:
MGD12 SOL54
MGD14 SOL74
MGD10 SOL37
MGD16 SOL65
MGD21 SOL66
MGD2 SOL65
MGD64 SOL74
MGD10 SOL37
MGD72 SOL74
MGD12 SOL54
内水桥时:MGD和SOL相同(重复)。外水桥当:MGD不同,SOL相同
比如第三栏我写哪条线是内水桥哪条线是外水桥
1.MGD12 SOL54 inner (the same in line 10)
2.MGD14 SOL74 outer (the same SOL in 7, 9)
3.MGD10 SOL37 inner (the same in line 8)
4.MGD16 SOL65 outer (the same SOL in 6)
5.MGD21 SOL66 no water bridge
6.MGD2 SOL65 outer (the same SOL in 4)
7.MGD64 SOL74 outer (the same SOL in 2, 9)
8.MGD10 SOL37 inner (the same in line 3)
9.MGD72 SOL74 outer (the same SOL in 2, 7)
10.MGD12 SOL54 inner (the same in line 1)
在输出中,我只需要内部和外部水桥的数量。在这种情况下,它只会是数字 4 和 5。
4 5
我试着写一个脚本,但我不知道我应该在条件中放什么,也许我应该使用数组?
#!/bin/bash
awk '{ if () inner++; else if () outer++} END { print inner " " outer}' probe.txt
编辑,我尝试使用该脚本,但它不起作用
#!/bin/bash
awk 'NR==FNR {a[,]++; s[]++; next}
a[,]!=s[] {outer++; next}
s[]!=1 {inner++}
END {print inner,outer}' probe.txt | tee probe2.txt
输入
MGD12 SOL54
MGD14 SOL74
MGD10 SOL37
MGD16 SOL65
MGD21 SOL66
MGD2 SOL65
MGD64 SOL74
MGD10 SOL37
MGD72 SOL74
MGD12 SOL54
在输出中我有一个空行 (probe2.txt)
当我尝试另一个 scipt
#!/bin/bash
awk 'NR==FNR {a[,]++; s[]++; next}
{print [=17=], (a[,]==s[]?(s[]==1?"no":"inner"):"outer")}' probe.txt | tee probe2.txt
我的输出又是空的。
双扫描方法更容易...
$ awk 'NR==FNR {a[,]++; s[]++; next}
{print [=10=], (a[,]==s[]?(s[]==1?"no":"inner"):"outer")}' file{,}
MGD12 SOL54 inner
MGD14 SOL74 outer
MGD10 SOL37 inner
MGD16 SOL65 outer
MGD21 SOL66 no
MGD2 SOL65 outer
MGD64 SOL74 outer
MGD10 SOL37 inner
MGD72 SOL74 outer
MGD12 SOL54 inner
只是计数
$ awk 'NR==FNR {a[,]++; s[]++; next}
a[,]!=s[] {outer++; next}
s[]!=1 {inner++}
END {print inner,outer}' file{,}
4 5