首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Bash / Shell:在bash脚本中解析CSV文件并跳过第一行

Bash / Shell:在bash脚本中解析CSV文件并跳过第一行
EN

Stack Overflow用户
提问于 2020-11-19 20:51:02
回答 3查看 646关注 0票数 0

我试图解析一个csv文件(其中包含每个用户的用户I和工作时间)。我写了以下脚本:

代码语言:javascript
运行
复制
#save weekly average to a file
    while IFS=, read -r col1 col2 col3 col4 col5 col6 col7
    do
        echo "$col2  ($col3+$col4+$col5+$col6+$col7)/5"
    done < user-list.txt

我面临以下两个问题:

  1. 我想跳过csv文件的第一行,因为它包含头
  2. ,我正在试图计算平均值,但是echo命令没有执行表达式。

输入文件中的一些示例数据是:

代码语言:javascript
运行
复制
Computer ID,User ID,M,T,W,T,F
Computer1,User3,5,7,3,5,2

任何帮助都将不胜感激。提亚

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-11-19 21:21:26

OP尚未(尚未)提供任何示例输入数据或期望的输出,因此假设如下:

  • 数据值可以是整数或reals,正的或负的
  • ,用户想要的是每一行的平均值(不需要计算整个文件的平均值)

一些样本数据:

代码语言:javascript
运行
复制
$ cat user-list.txt
a,b,c,d,e,f,g,h
1,id1,3,4,5,6,7
2,id2,13,14.233,15,16,17
3,id2,3.2,4.3,5.9233,6.0,7.32
4,id4,-3.2,4.3,-15.3,96.0,7.32

一种awk解决方案:

代码语言:javascript
运行
复制
$ awk -F"," 'FNR>=2 { printf "%s %10.3f\n", $2, ($3+$4+$5+$6+$7)/5.0 }' user-list.txt

其中:

  • -F"," -使用逗号作为输入字段separator
  • FNR>=2 -跳过file
  • printf "%s %10.3f\n"的第一行-使用%s格式打印字段2;使用%10.3f格式打印平均值(小数点左侧为10 w/最大值6位,小数右侧为3位);在

末尾附加一行提要(\n)。

以上所述产生:

代码语言:javascript
运行
复制
id1      5.000
id2     15.047
id2      5.349
id4     17.824

OP增加了一个新的要求..。然而,根据计算的平均数对输出进行排序,有几个潜在的问题需要OP进一步的投入:

  • 可以在数据文件中多次显示userID吗?
  • ,如果一个userID可以显示不止一次,那么我们需要为每个唯一的userID生成一行输出还是为userID的每次出现生成单独的行?
  • 是要按升序或降序排序的数据吗?

现在我要假设:

  • A userID可能在源数据中出现不止一次(例如,就像我的示例数据集中的id2一样-上面)。
  • in将not为给定的userID组合多行(即,每一行将各自独立)。
  • 我们将按升序和降序显示排序。H 241f 242

虽然排序可以在awk中完成,但我将选择将awk输出输送到sort,因为这需要更少的代码,而且(imo)更容易理解。

提升排序:

代码语言:javascript
运行
复制
$ awk -F"," 'FNR>=2 { printf "%s %10.3f\n", $2, ($3+$4+$5+$6+$7)/5.0 }' user-list.txt | sort -nk2
id1      5.000
id2      5.349
id2     15.047
id4     17.824

其中sort -nk2说使用n数字排序按列#2排序。

降序排序:

代码语言:javascript
运行
复制
$ awk -F"," 'FNR>=2 { printf "%s %10.3f\n", $2, ($3+$4+$5+$6+$7)/5.0 }' user-list.txt | sort -rnk2
id4     17.824
id2     15.047
id2      5.349
id1      5.000

其中sort -rnk2说使用n数字排序按列#2排序,但r则使用顺序

票数 0
EN

Stack Overflow用户

发布于 2020-11-19 21:05:17

试一试

代码语言:javascript
运行
复制
awk -F, 'NR > 1 { map[$2]=($3+$4+$5+$6+$7)/5 } END { PROCINFO["sorted_in"]="@val_num_asc";for (i in map) { printf "%s %.2f\n",i,map[i] } }' user-list.txt

通过-F使用逗号作为字段分隔符,添加第三、第四、第五、第六和第七个字段,然后除以5,将结果放入一个名为map的数组中,由用户索引($2)。忽略NR > 1的标头。最后,将数组的排序设置为值的升序,并通过数组循环,打印索引(用户)和值到小数点2位。

票数 0
EN

Stack Overflow用户

发布于 2020-11-19 21:09:39

对于您的第一个问题,这将解决以下问题:

代码语言:javascript
运行
复制
#save weekly average to a file
while IFS=, read -r col1 col2 col3 col4 col5 col6 col7
do
    echo "$col2  ($col3+$col4+$col5+$col6+$col7)/5"
done < <tail -n +2 user-list.txt

第二个更复杂一些-- echo命令仅用于显示变量内容或ny类的输出,而不是用于数学表达式。使用下面的expr命令:

代码语言:javascript
运行
复制
myvar=$((1 + 2)); result=$(($myvar / 3)); echo $result

像这样的事情,只要稍微适应一下你的问题,就能解决它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64919776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档