gpt4 book ai didi

linux - awk - 取出对列并获取出现次数

转载 作者:行者123 更新时间:2023-12-04 00:13:28 27 4
gpt4 key购买 nike

我有一个表模式 - 列名以逗号分隔。为清楚起见,我将它们放在每行一列中,如下所示

$ cat cols_name.txt
id
resp
x_amt
rate1
rate2
rate3
pay1
pay2
rate_r1
rate_r2
x_rate1
x_rate2
x_rate3
x_rate_r1
x_rate_r2
x_pay1
x_pay2
rev1
x_rev1

我需要找出与列对 (pay1 -> x_pay1) 匹配的对,并将它们列在一起作为中间输出,如下所示

x_rate1 rate1
x_rate2 rate2
x_rate3 rate3
x_pay1 pay1
x_pay2 pay2
x_rate_r1 rate_r1
x_rate_r2 rate_r2
x_rev1 rev1

最后将频率打印为

 pay 2
rate 3
rate_r 2
rev 1

在我尝试获取中间输出时,下面的 awk 命令不起作用。

awk ' NR==FNR { if( $1~/^x_/ ) a[$1]=1 ; next }  $1~/"x_" a[$1]/ { print $0 } ' cols_name.txt cols_name.txt

它没有打印任何东西。你能帮忙修一下吗

最佳答案

这里是单程 awk 来完成它:

 awk '/^x_/ {xk[$0]; next} {s=$0; sub(/[0-9]+$/, "", s); xv[$0]=s} END {for (i in xv) if ("x_" i in xk) {print "x_" i, i; ++fq[xv[i]]}; print "== Summary =="; for (i in fq) print i, fq[i]}' file

x_rev1 rev1
x_rate1 rate1
x_rate2 rate2
x_rate3 rate3
x_rate_r1 rate_r1
x_pay1 pay1
x_rate_r2 rate_r2
x_pay2 pay2
== Summary ==
rate_r 2
rate 3
rev 1
pay 2

更具可读性的形式:

awk '
/^x_/ {
xk[$0]
next
}
{
s = $0
sub(/[0-9]+$/, "", s)
xv[$0] = s
}
END {
for (i in xv)
if ("x_" i in xk) {
print "x_" i, i
++fq[xv[i]]
}
print "== Summary =="
for (i in fq)
print i, fq[i]
}' file

关于linux - awk - 取出对列并获取出现次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66260702/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com