使用bash/sed将文件名的一部分预备到.csv文件



我在一个目录中有几个文件,这些文件是这样的;

1_38OE983729JKHKJV.csv

一个整数,然后是一个ID(整数和ID都是唯一的)。

我需要为文件夹中每个文件的每一行将此ID预先将其预留到数据库中的文件(并丢弃文件名的整数部分)。文件的内容看起来像这样:

BW;20015;11,45;0,49;41;174856;4103399
BA;25340;11,41;0,55;40;222161;4599779
BB;800;7,58;0,33;42;10559;239887
HE;6301;9,11;0,39;40;69191;1614302
.
.
.
Total;112613;9,33;0,43;40;1207387;25897426

最终结果应该看起来像这样:

38OE983729JKHKJV;BW;20015;11,45;0,49;41;174856;4103399
38OE983729JKHKJV;BA;25340;11,41;0,55;40;222161;4599779
38OE983729JKHKJV;BB;800;7,58;0,33;42;10559;239887
38OE983729JKHKJV;HE;6301;9,11;0,39;40;69191;1614302
.
.
.
38OE983729JKHKJV;Total;112613;9,33;0,43;40;1207387;25897426

感谢您的帮助!

编辑:清晰的拼写和词汇

for上的文件循环,使用参数扩展来提取ID。

#!/bin/bash
for csv in *.csv ; do
    prefix=${csv%_*}
    id=${csv#*_}
    id=${id%.csv}
    sed -i~ "s/^/$id;/" "$csv"
done

如果ID可以包含下划线,则可能需要更加小心。

with awk 工具:

for f in *csv; do awk '{ fn=FILENAME; $0=substr(fn,index(fn,"_")+1,length(fn)-6)";"$0 }1' "$f" > tmp && mv tmp "$f"; done
  • fn=FILENAME-文件名

在单个尴尬中也尝试关注,并且它将照顾在此操作期间打开的文件数量,以便我们避免打开的最大文件数量的错误。

awk 'FNR==1{close(val);val=FILENAME;split(FILENAME,a,"_");sub(/..*/,"",a[2])} {print a[2]","$0}' *.csv

with gnu awk用于Inploph editing and gensub()您需要的是:

awk -i inplace '{print gensub(/.*_(.*)..*/,"\1;",1,FILENAME) $0}' *.csv

无需外壳循环或其他任何必要的命令。

最新更新