首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AWK:在csv文件中添加缺失行,并将特定列设置为"0“

AWK:在csv文件中添加缺失行,并将特定列设置为"0“
EN

Unix & Linux用户
提问于 2022-01-27 18:53:34
回答 1查看 93关注 0票数 1

(注:这个问题被大大缩短了,因为详细的问题被“这看起来像垃圾邮件”所屏蔽。)

我很难用awk/gawk在分号分隔的csv文件中添加缺失的行到一系列数据中。

Sample数据

代码语言:javascript
复制
date;city;gender;status;value
2019-10;New York City;women;AL;5
2019-10;New York City;women;SC;2
2019-10;New York City;men;AL;3
2019-10;New York City;men;SC;1
2019-12;New York City;men;AL;5
2019-12;New York City;men;SC;3
2020-01;New York City;women;AL;8
2020-01;New York City;men;SC;2

目标对于每年(从文件中出现的第一年开始(此处为"2019"),以文件中出现的最后一年(此处为“2020”)和月份(从文件中出现的第一个月开始(此处为"10"),以文件中出现的最后一个月(此处为“01”)结束)应该有4行。

"2019-10“月的示例数据显示了我所需要的数据的正确出现:一年中每个月4行,女性2行,具有AL和SC地位的男性各2行。

Desired输出

代码语言:javascript
复制
date;city;gender;status;value
2019-10;New York City;women;AL;5
2019-10;New York City;women;SC;2
2019-10;New York City;men;AL;3
2019-10;New York City;men;SC;1
2019-11;New York City;women;AL;0
2019-11;New York City;women;SC;0
2019-11;New York City;men;AL;0
2019-11;New York City;men;SC;0
2019-12;New York City;women;AL;0
2019-12;New York City;women;SC;0
2019-12;New York City;men;AL;5
2019-12;New York City;men;SC;3
2020-01;New York City;women;AL;8
2020-01;New York City;women;SC;0
2020-01;New York City;men;AL;0
2020-01;New York City;men;SC;2

缺行值应为0。原始数据还包括没有一个月线的发生情况(无论是女性还是男性,甚至不提供任何服务)。

任何帮助都是非常感谢的。由于这是我在这个平台上的第一篇文章,而且我的母语不是英语,所以请原谅我犯的任何错误。

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2022-01-27 22:27:03

在每个Unix框上使用任何shell中的任何awk:

代码语言:javascript
复制
$ cat tst.awk
BEGIN {
    FS=OFS=SUBSEP=";"
    split("women" FS "men", genders)
    split("AL" FS "SC", statuses)
}
NR == 1 {
    print
    next
}
{
    vals[$1,$2,$3,$4] = $5
    if ( NR == 2 ) {
        begDate = $1
        city = $2
    }
    endDate = $1
}
END {
    split(begDate,begYm,/-/)
    split(endDate,endYm,/-/)
    for ( yr=begYm[1]; yr<=endYm[1]; yr++ ) {
        begMth = ( yr == begYm[1] ? begYm[2] : 1 )
        endMth = ( yr == endYm[1] ? endYm[2] : 12 )
        for ( mth=begMth; mth<=endMth; mth++ ) {
            date = sprintf("%04d-%02d", yr, mth)
            for ( i=1; i in genders; i++ ) {
                for ( j=1; j in statuses; j++ ) {
                    idx = date FS city FS genders[i] FS statuses[j]
                    print idx, vals[idx]+0
                }
            }
        }
    }
}
代码语言:javascript
复制
$ awk -f tst.awk file
date;city;gender;status;value
2019-10;New York City;women;AL;5
2019-10;New York City;women;SC;2
2019-10;New York City;men;AL;3
2019-10;New York City;men;SC;1
2019-11;New York City;women;AL;0
2019-11;New York City;women;SC;0
2019-11;New York City;men;AL;0
2019-11;New York City;men;SC;0
2019-12;New York City;women;AL;0
2019-12;New York City;women;SC;0
2019-12;New York City;men;AL;5
2019-12;New York City;men;SC;3
2020-01;New York City;women;AL;8
2020-01;New York City;women;SC;0
2020-01;New York City;men;AL;0
2020-01;New York City;men;SC;2

请注意,即使您的“城市”值包含一个-,例如Washington-on-the-Brazos,也能正常工作,因为在FS值中不包括-,而是在末尾部分调用split()将日期分隔为年份和月份。

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

https://unix.stackexchange.com/questions/688226

复制
相关文章

相似问题

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