gpt4 book ai didi

linux - 使用 shell 脚本进行 CSV 操作

转载 作者:太空宇宙 更新时间:2023-11-04 04:57:29 25 4
gpt4 key购买 nike

我有一个像这样的 CSV 文件

Country,Jan1,Feb1,.....,Dec16 
India,100,2000,........,1500
China,4768,46783,.......,3000
Canada,4789,7393,.......,9843

我想获得以下格式的输出

India,100,Jan1 
China,4768,Jan1
Canada,4789,Jan1
India,2000,Feb1
China,46783,Feb1
Canada,7393,Feb1
.
.
.
India,1500,Dec16
China,3000,Dec16
Canada,9843,Dec16

有人可以分享一下,上述事情如何在 Shell 脚本中实现吗?

感谢和问候,罗宾·大卫

最佳答案

您可以尝试这个 awk 脚本:

脚本.awk

BEGIN { ctrNo = 1 }

NR==1 { # store time colheaders
for( c = 2 ; c <= NF; c++ ) TimeMember[ c-1] = $c;
next
}

{ # for NR > 1: store value under key country and TimeMember
ctry = $1
for( c = 2; c<= NF; c++ ) {
key = sprintf("%s,%s", ctry, TimeMember[ c - 1 ] )
values[ key ] = $c
}

if( !( ctry in seen) ) {
seen[ ctry ] = 1;
countries [ ctrNo++ ] = ctry
}
}

END {
OFS=FS
for( c = 1; c <= length( TimeMember ) ; c++ ){
for( ctr = 1; ctr <= length( countries ) ; ctr++ ) {
key = sprintf("%s,%s", countries[ ctr], TimeMember[ c ] )
print countries[ ctr], values[ key ], TimeMember[ c ]
}
}
}

运行它:awk -F, -f script.awk yourfile

说明

  • BEGIN 部分初始化变量
  • NR==1 Action 在第一行执行,它存储第一行中的所有 TimeMember。 next 负责跳过其他操作。
  • 以下操作会解析数据行,并将每个 TimeColumn 的值与 CountryMember 一起存储在 values 中。每个新国家/地区都会在 END 操作的输出过程中获得一个新的序列号
  • END 操作用于打印存储的信息。它循环遍历第一行的不同 TimeMembers 以及数据行第一列的 Country Dimension 的每个成员。

关于linux - 使用 shell 脚本进行 CSV 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42441138/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com