awk - 如何打印用户指定的字段
问题描述
我正在编写一个 AWK 脚本,该脚本将让用户输入字段并让脚本计算每个单词在该字段中出现的次数。我已经设置了代码,以便它已经打印出所有字段以及每个单词出现的次数,但我试图只计算用户指定的字段。用户将输入 CSV 文件,因此我将 FS 设置为逗号。
知道 AWK 假定输入的所有参数都将是一个文件,我将参数设置为一个数组,然后从 ARGV 数组中删除它们,这样它就不会抛出错误。
#!/usr/bin/awk -f
BEGIN{ FS = ",";
for(i = 1; i < ARGC-1; i++){
arg[i] = ARGV[i];
delete ARGV[i];
}
}
{
for(i=1; i <=NF; i++)
words[($i)]++
}
END{
for( i in words)
print i, words[i];
}
因此,如果用户输入 CSV 文件,例如...
A,B,D,D
Z,C,F,G
Z,A,C,D
Z,Z,C,Q
并且用户希望只计算输出的字段 3 应该是......
C 3
F 1
或者,如果字段的用户 1 和 3...
A 2
B 1
C 1
Z 4
解决方案
您能否尝试关注(我已经在移动设备上编写了此内容,因此无法测试)。
awk -v fields="1,3" '
BEGIN{
FS=OFS=","
num=split(fields,array,",")
for(j=1;j<=num;j++){
a[array[j]]
}
}
{
for(i=1;i<=NF;i++){
if(i in a){
count[$i]++
}
}
}
END{
for(h in count){
print h,count[h]
}
}
' Input_file
我相信这也适用于解析多个 Input_files。如果需要,您可以尝试将多个文件传递给它。
说明:以下仅作说明之用。
-v fields="1,3"
创建一个名为 fields 的变量,其值是用户定义的,它应该用逗号分隔,例如我采用了 1 和 3,您也可以根据需要保留它。
BEGIN{......}
在此处开始 BEGIN 部分,其中提到字段分隔符和输出字段分隔符为所有 Input_file(s) 行的逗号。然后使用 split 我将变量字段拆分为一个名为 array 的数组,其分隔符是逗号。变量 num 中的字段长度可变。从 1 到 num 的值开始一个 for 循环。在其中创建一个名为 a 的数组,其索引是数组的值,其索引是变量 j 值。
MAIN 部分:现在开始一个遍历所有行字段的 for 循环。然后它检查是否有任何字段编号进入我们在 BEGIN 部分创建的名为 a 的数组,如果是,则它正在创建一个名为 count 的数组,其中包含当前列的索引 + 也计算其计数。我们需要根据 OP 的要求。
最后在这个程序的END
部分遍历数组计数并用它们的计数打印它的索引。
推荐阅读
- batch-file - Video modifications using ffmpeg and windows batch command
- php - 删除子只学说2 symfony
- angular - Angular(7)加载错误的惰性模块
- neo4j - 用于存储嵌套评论的图形数据库
- greatest-n-per-group - ClickHouse 中按组排列的前 N 行
- vue.js - 如何使用 Vue.JS 和这种布局实现子域路由(图片)
- raspberry-pi3 - 覆盆子 pi3 上的 NixOS 无头设置
- npm - 未找到 es6 导出默认值,但可在 node_modules 内部工作
- python - 使用 PyQt5 getOpenFileName 打开文件时遇到问题
- azure - Azure 函数插入但不更新 cosmosDB