我正在尝试使用 awk 来旋转文件。这是我的输入文件的示例:
P2P,P2P,MP,DL,AIR,UP,HR,UPE,GSM,S,PP,1,NA,0.2,0.2
P2P,P2P,MP,DL,AI,UP,HR,UPE,GSM,F,PP,4,NA,0.2,0.8
P2P,P2P,MP,DL,AIR,UP,HR,UPE,GSM,S,PP,1,NA,0.2,0.2
P2P,P2P,MP,DL,AI,UP,HR,UPE,GSM,S,PP,1,NA,0.2,0.2
P2P,P2P,MP,DL,AIR,UP,HR,UPE,GSM,S,PP,1,NA,0.2,0.2
P2P,P2P,MP,DL,AIR,UP,HR,UPE,GSM,F,PP,1,NA,0.2,0.2
P2P,P2P,MP,DL,BIR,UP,HR,UPE,GSM,S,PP,10,NA,0.2,2
P2P,P2P,MP,KT,AIR,UP,HR,UPE,GSM,S,PP,1,NA,0.2,0.2
P2P,P2P,MP,MM,AIR,UP,HR,UPE,GSM,S,PP,1,NA,0.2,0.2
所需的输出应如下。
AIR,5,1
AI,1,0.2
BIR,10,2
- 这里第一个字段属于
$5
. - 第二个字段属于
$12
(总计$12
)。 - 第三个字段属于
$15
(总计$15
)。
条件应符合以下条件awk
:
$3=="MP" && $10=="S" && $5!="MP"
答案1
和awk
:
awk -F, '$3=="MP"&&$10=="S"&&$5!="MP"{a[$5]+=$12;b[$5]+=$15}
END{for(i in a){print i","a[i]","b[i]}}' file
-F,
将分隔符设置为,
.$3=="MP"&&$10=="S"&&$5!="MP"{...}
这是问题的条件a[$5]+=$12;b[$5]+=$15
a
用 的总值填充一个数组,并用 的总值填充$12
一个数组。b
$15
END{...}
该块在awk
处理完所有行后运行。for(i in a)
循环遍历a
数组print i","a[i]","b[i]}
打印两个数组中的值及其索引。
输出:
AI,1,0.2
AIR,5,1
BIR,10,2
答案2
使用 awk 进行过滤和GNU 数据整合对于旋转你可以这样做:
$ awk -F, '$3=="MP" && $10=="S" && $5!="MP"' FILE.TXT \
| datamash --sort -t, --group 5 sum 12 sum 15
AI,1,0.2
AIR,5,1
BIR,10,2