基于Bash中文件名分组文件名的最佳方法?

问题描述 投票:0回答:4

我有一个包含以下文件的文件夹:

DA-001-car.jpg
DA-001-dog.jpg
DA-001-coffee.jpg
DA-002-house.jpg
DA-003-coffee.jpg
DA-003-cat.jpg
...

我想生成此(CSV)输出:

SKU, IMAGE
DA-001, "DA-001-car.jpg, DA-001-dog.jpg, DA-001-coffee.jpg"
DA-002, "DA-001-house.jpg"
DA-003, "DA-001-coffee.jpg, DA-001-cat.jpg"

我尝试在Bash中对此进行编程:

#!/bin/bash
echo "SKU, FILE" >> tmp.csv
for file in /home/calvin/test/*.jpg
do
    SKU_NAME="${file##*/}"
    echo ${SKU_NAME:0:6}, \"inner for-loop?, ?, ?\" >> tmp.csv
done
uniq tmp.csv output.csv

您可以看到,对于编程我是一个菜鸟:)请帮帮我,谢谢!!

我有一个包含以下文件的文件夹:DA-001-car.jpg DA-001-dog.jpg DA-001-coffee.jpg DA-002-house.jpg DA-003-coffee.jpg DA-003- cat.jpg ...我想生成以下(CSV)输出:SKU,IMAGE DA -...

bash csv for-loop awk uniq
4个回答
1
投票

这可以解决问题。这需要GNU awk以升序输出。如果您不关心订单,则可以使用任何旧的awk并删除PROCINFO


1
投票

如果文件名不包含空格,则可以使用sed代替内部循环:


1
投票
awk '
    BEGIN {
        OFS = ", "
        print "SKU", "IMAGE"
        for (i=1; i<ARGC; i++) {
            curr = fname = ARGV[i]
            sub(/-[^-]+$/,"",curr)
            if ( curr != prev ) {
                if ( i > 1 ) {
                    print prev, "\"" fnames "\""
                }
                prev = curr
                fnames = ""
            }
            fnames = (fnames == "" ? "" : fnames OFS) fname
        }
        print prev, "\"" fnames "\""
        exit
    }
' /home/calvin/test/*.jpg
SKU, IMAGE
DA-001, "DA-001-car.jpg, DA-001-coffee.jpg, DA-001-dog.jpg"
DA-002, "DA-002-house.jpg"
DA-003, "DA-003-cat.jpg, DA-003-coffee.jpg"

0
投票

作为所有答复的结果,并建议我使用此代码来实现所需的输出:

© www.soinside.com 2019 - 2024. All rights reserved.