如何在bash中将具有相同前缀名称的csv文件打包成zip

SA2*_*018 3 bash shell

假设我有许多 csv 文件位于/home/user/test

123_24112021_DONG.csv
122_24112021_DONG.csv
145_24112021_DONG.csv
123_24112021_FINA.csv
122_24112021_FINA.csv
145_24112021_FINA.csv
123_24112021_INDEM.csv
122_24112021_INDEM.csv
145_24112021_INDEM.csv
Run Code Online (Sandbox Code Playgroud)

如您所见,所有文件都有三个唯一的前缀:

145
123
122
Run Code Online (Sandbox Code Playgroud)

而且,我需要为每个前缀创建 zip,其中将包含 csv 文件。请注意,实际上,我不知道 csv 文件的数量,这只是一个示例(每个前缀 3 个 csv 文件)。我开发了一个代码,可以从 bash 表中的所有 csv 名称中提取前缀:

for entry in "$search_dir"/*
do
  # extract csv files
  f1=${entry##*/}
  echo $f1
  # extract prefix of each file
  f2=${f1%%_*}
  echo $f2
  # add prefix in table
  liste_sirets+=($f2)
done

# get uniq prefix in unique_sorted_list

unique_sorted_list=($(printf "%s\n" "${liste_sirets[@]}" | sort -u ))
echo $unique_sorted_list
Run Code Online (Sandbox Code Playgroud)

结果如下:

145
123
122
Run Code Online (Sandbox Code Playgroud)

现在我想将由其前缀定义的每三个文件压缩在同一个 zip 文件中:换句话说,创建123_24112021_M2.zip其中将包含

123_24112021_DONG.csv
123_24112021_FINA.csv
123_24112021_INDEM.csv
Run Code Online (Sandbox Code Playgroud)

122_24112021_M2.zip 145_24112021_M2.zip...

因此,我开发了一个循环,该循环将重点关注位于本地路径中的 csv 文件的每个前缀名称,然后压缩所有具有相同前缀名称的文件:

for i in $unique_sorted_list
do
for j in "$search_dir"/*
do
if $(echo $j| cut -d'_' -f1)==$i
zip -jr $j
done
Run Code Online (Sandbox Code Playgroud)

但是,它不起作用,请帮忙!谢谢 !

M. *_*din 5

使用 bash 和 shell 实用程序:

#!/bin/bash

printf '%s\n' *_*.csv | cut -d_ -f1 | uniq |
while read -r prefix
do
        zip "$prefix".zip "$prefix"_*.csv
done
Run Code Online (Sandbox Code Playgroud)

更新:
还要求按日期对文件进行分组(文件名的第二部分):

#!/bin/bash

printf '%s\n' *_*_*.csv | cut -d_ -f2 | sort -u |
while read -r date
do
        zip "$date".zip ./*_"$date"_*.csv
done
Run Code Online (Sandbox Code Playgroud)