【问题标题】:Recover informations from CSV files with my awk script使用我的 awk 脚本从 CSV 文件中恢复信息
【发布时间】:2019-06-27 08:10:29
【问题描述】:

我有这个 CSV 文件:

Monday,linux,6,0.2
Tuesday,linux,0.25,0.2
Wednesday,linux,64,3

我创建了一个小脚本,允许我从我的 csv 中恢复信息 并像这样放置它们:

Day : Monday
OS : Linux
RAM : 6
CPU1 : 0.2

我的脚本是:

#!/bin/bash

awk -F'[ ,;|.]' 'FNR==0{next}
               FNR>1 {
                        print "DAY : " $1;
                        print "OS :\n " $2
                        print "RAM :\n " $3
                        print "CPU1 :\n " $4
                     }' mycsvfile.csv

但结果是:

DAY : Tuesday
OS :
 linux
RAM :
 0
CPU1 :
 25
DAY : Wednesday
OS :
 linux
RAM :
 64
CPU1

或者我想要:

DAY : Monday
OS : linux
RAM : 0.2
CPU 1 : 1

DAY : Tuesday
OS : linux
RAM : 0.25
CPU 1 : 0.2

DAY : Wednesday
OS : linux
RAM : 64
CPU 1 : 3

你能告诉我为什么我的脚本不起作用以及为什么不考虑浮点数吗?

谢谢!

【问题讨论】:

  • 您将. 作为字段分隔符。使用-F'[ ,]'-F'[[:space:],]' 而不是-F'[ ,;|.]'
  • wrt FNR==0{next} - 鉴于FNR 是当前正在读取的文件中的行号,您希望FNR==0 何时为真? wrt FNR>1 { - 为什么要跳过 CSV 的第一行?您的真实数据中是否确实存在您的示例中未显示的标题行?

标签: linux bash csv awk


【解决方案1】:

在 Cyrus 发布的同一 awk 中添加了选项卡和换行符。

awk -F ',' '{
    print "DAY :",$1
    print "OS :",$2
    print "RAM :",$3
    print "CPU1 :",$4"\n"
}' OFS='\t' file

DAY :   Monday
OS :    linux
RAM :   6
CPU1 :  0.2

DAY :   Tuesday
OS :    linux
RAM :   0.25
CPU1 :  0.2

DAY :   Wednesday
OS :    linux
RAM :   64
CPU1 :  3

更通用的解决方案:

awk -F, 'BEGIN {split("DAY OS RAM CPU", header, " ")}{for (i=1;i<=4;i++) print header[i]":\t",$i;print ""}' t
DAY:     Monday
OS:      linux
RAM:     6
CPU:     0.2

DAY:     Tuesday
OS:      linux
RAM:     0.25
CPU:     0.2

DAY:     Wednesday
OS:      linux
RAM:     64
CPU:     3

更具可读性:

awk -F, '
    BEGIN {split("DAY OS RAM CPU", header, " ")}
    {
    for (i=1;i<=4;i++)
        print header[i]":\t",$i;
    print ""
    }' file

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    相关资源
    最近更新 更多