【问题标题】:Linux command line to process CSV处理 CSV 的 Linux 命令行
【发布时间】:2015-10-16 02:28:25
【问题描述】:

我有以下 CSV 文件:

数据.csv

Chart #,Ticker,Industry,Last Price,Multiple
2,AFL,Accident & Health Insurance,60.9,0.82
3,UNM,Accident & Health Insurance,32.97,1.52
4,CNO,Accident & Health Insurance,19.33,2.59
2,OMC,Advertising Agencies,71.71,0.7
3,IPG,Advertising Agencies,21.24,2.35
4,ADS,Advertising Agencies,278.18,0.18
2,UPS,Air Delivery & Freight Services,103.8,0.48
3,FDX,Air Delivery & Freight Services,152.11,0.33
4,EXPD,Air Delivery & Freight Services,50.725,0.99
5,CHRW,Air Delivery & Freight Services,72.3,0.69
6,FWRD,Air Delivery & Freight Services,42.86,1.17

我想使用 Awk 或最好的 linux 命令行工具来使文件中的日期看起来像这样:

输出.txt

Accident & Health Insurance
2*0.82,3*1.52,4*2.59

Advertising Agencies
2*0.7,3*2.35,4*0.18

Air Delivery & Freight Services
2*0.48,3*0.33,4*0.99,5*0.69,6*1.17

我基本上将所有“图表#”乘以倍数并在一行上输出“行业”,所有图表用倍数逗号分隔,然后在第三行有一个空格......然后它处理整个列表。

有人可以为我指出正确的方向吗? Awk 是完成这项任务的最佳工具,还是我必须创建一个 bash 脚本来处理它?

【问题讨论】:

  • 你试过什么?你在哪里卡住了?你离想要的东西有多近? awk 将是完成这项任务的绝佳工具。
  • 是的,awk 是完成这一切的正确工具。
  • 您想要一个完整的答案吗?也就是说,您想尝试自己解决这个问题,还是只需要脚本作为达到目的的手段(您的问题表明您只需要提示)?
  • 请看下文...感谢您的帮助!

标签: linux bash csv awk


【解决方案1】:
$ awk -F, -v OFS='\n' -v ORS='\n\n' '
    NR==1 { next }
    (NR>2) && ($3!=prevKey) { print prevKey, prevRec; prevRec="" }
    { prevKey=$3; prevRec=(prevRec==""?"":prevRec",") $1"*"$NF }
    END { print prevKey, prevRec }
' file
Accident & Health Insurance
2*0.82,3*1.52,4*2.59

Advertising Agencies
2*0.7,3*2.35,4*0.18

Air Delivery & Freight Services
2*0.48,3*0.33,4*0.99,5*0.69,6*1.17

上述与@A-Ray's answer的功能区别在于:

  1. 我假设文件按 $3 排序,如您的示例输入所示,而 A-Rays 没有。
  2. Mine 一次仅将与一个 $3 值关联的输出字符串存储在内存中,而 A-Rays 一次存储所有 $3 值的所有输出字符串。
  3. Mine 以 $3 值在输入文件中出现的顺序打印输出,而 A-Rays 以“随机”顺序(它们的索引存储在哈希表中的顺序)打印输出。
  4. 我的会在输出记录之间打印一个空白行,如您的预期输出所示,而 A-Rays 不会。

【讨论】:

  • 这正是我想要的!这是100%的钱。谢谢!
【解决方案2】:
awk -F, '{a[$3]=a[$3]?a[$3]","$1"*"$NF:$1"*"$NF}END{for(i in a)print i"\n"a[i]}' filename
Air Delivery & Freight Services
2*0.48,3*0.33,4*0.99,5*0.69,6*1.17
Advertising Agencies
2*0.7,3*2.35,4*0.18
Accident & Health Insurance
2*0.82,3*1.52,4*2.59

【讨论】:

  • 您应该将三元表达式更改为a[$3]=($3 in a?a[$3]",":"") $1"*"$NF,以实现可移植性、减少冗余,并且即使a[$3] 的数值计算为零(例如,字符串以0*... 开头)也能正常工作。 +1 是一个很好的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-01
相关资源
最近更新 更多