![模式文件作为 awk/sed/grep 中 RS、FS 的输入来识别和添加列](https://linux22.com/image/115731/%E6%A8%A1%E5%BC%8F%E6%96%87%E4%BB%B6%E4%BD%9C%E4%B8%BA%20awk%2Fsed%2Fgrep%20%E4%B8%AD%20RS%E3%80%81FS%20%E7%9A%84%E8%BE%93%E5%85%A5%E6%9D%A5%E8%AF%86%E5%88%AB%E5%92%8C%E6%B7%BB%E5%8A%A0%E5%88%97.png)
我有一个文件,其中包含我必须在给定数据集中找到的模式,并将数字添加到数据列中。我想编写一个脚本或使用 awk/sed/grep 自动查询给定文件中的模式,以与我拥有的数据进行交叉检查,并在具有匹配模式的列中添加数字。
例子:-
数据
标题、计数、RESA
10th ECOMF,PAB 1 MAT
10th ICOCPS (CPV-'10) 23 SCI
10th ICOCPS (CPV-'10) 6 SCI
10th ICOMAMOS (M2S-X) 3 EEE
JOP 32 COP
AIP 34 Sff
JOP 43 COP
HIT 42 tilde
我的模式文件包含期刊名称:-
10th ECOMF,PAB
10th ICOCPS (CPV-'10)
10th ICOCPS (CPV-'10)
10th ICOMAMOS (M2S-X)
JOP
AIP
JOP
HIT
SUPERCONDUCTIVITY (M2S-X)
期望的输出:
10th ECOMF,PAB 1
10th ICOCPS (CPV-'10) 29
10th ICOMAMOS (M2S-X) 3
JOP 75
AIP 34
HIT 42
.
.
很快,
PS:- 数据是制表符分隔的,我在 CSV 中也有相同的数据。
答案1
awk解决方案:
awk 'BEGIN{ FS=OFS="\t" }
NR==FNR{ if(NF && !($0 in b)) { a[++c]=$0; b[$0] } next }{ b[$1]+=$2 }
END{ len=length(a); for(i=1;i<=len;i++) if(a[i] in b) print a[i],b[a[i]] }' patterns data
BEGIN{ FS=OFS="\t" }
- 设置字段分隔符a[++c]=$0; b[$0]
- 收集独特的杂志patterns
文件中的名称b[$1]+=$2
- 总结每个数字杂志data
文件内的名称if(a[i] in b) print a[i],b[a[i]]
- 将总和值附加到每个杂志pattern
文件中的名称
输出:
10th ECOMF,PAB 1
10th ICOCPS (CPV-'10) 29
10th ICOMAMOS (M2S-X) 3
JOP 75
AIP 34
HIT 42
...