【问题标题】:How to use awk to reformat two different types of csv files into one common format?如何使用 awk 将两种不同类型的 csv 文件重新格式化为一种通用格式?
【发布时间】:2021-04-29 03:28:22
【问题描述】:

我有一堆以下两种格式之一的 CSV 文件。

文件type-a.csv

name,age,breed,vip
jack,10,golden,no
mary,3,poodle,yes

文件type-b.csv

name,age,membership start,membership end,breed,vip
hazel,2,2018,2019,pit bull,yes
pot roast,4,2020,2021,lab,yes

我有两个问题。首先,我尝试使用 awk 将这些文件重新格式化为一种通用格式。像这样:

age,name,type,breed
10,jack,A,golden
3,mary,A,poodle
2,hazel,B,pit bull
4,pot roast,B,lab

这是我现在拥有的代码。我使用find 来查找所有满足命名约定的 CSV 文件。但是,我不确定如何处理awk

#find all csv files
for f in $(find $dir -iname 'type-*.csv' -type f)
do
        awk '
                BEGIN { Name=""; Type=""; Age=0; Breed=""; }                         
done

第二个问题是,这些文件都命名为type-*.csv。例如,type-a.csvtype-b.csv 等。我想将这些类型作为第三个 type 列包含到输出 CSV 文件中,但我不确定如何。

【问题讨论】:

  • 你有几个输入文件,你想要一个输出文件,对吗?
  • 是的,我想要一个输出文件。 @格伦杰克曼
  • 一旦您得到答案,您编辑问题的范围就会受到限制。您已经大大改变了问题,使答案无效,这是不允许的。如果绝对必要,您可以通过添加额外信息来修改问题,但您不应该删除问题的突出部分,因此不再清楚为什么答案是这样写的他们是。我已将问题回滚到原始版本,以便答案仍然相关。您确实提出了对答案的编辑 - 这不是一个好主意。得到答案后,不要理会这个问题。

标签: unix awk


【解决方案1】:

我愿意

{
    echo "age,name,type,breed"
    find . -name 'type-?.csv' -exec awk '
        BEGIN {FS = OFS = ","}
        FNR == 1 {
            type = toupper(substr(FILENAME, length(FILENAME)-4, 1))
            next
        }
        {print $2, $1, type, $(NF - 1)}
    ' '{}' +
} > output.csv

【讨论】:

    【解决方案2】:

    既然文件的类型和字段的数量有关,为什么不干脆做:

    echo "age,name,type,breed" > output.csv
    for f in $(find "$dir" -iname 'type-*.csv' -type f); do
      awk 'BEGIN{FS = OFS = ","}
        (FNR > 1){if (NF == 4) print $1, $2, "A", $3; else print $1, $2, "B", $5}' "$f"
    done >> output.csv
    

    【讨论】:

    • 只有两个文件符合“一堆文件”的条件吗?我的印象是文件不止两个,但文件格式只有两种。
    猜你喜欢
    • 1970-01-01
    • 2015-01-25
    • 2015-11-09
    • 2014-03-26
    • 1970-01-01
    • 2017-10-23
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多