我在一个目录中有几个文件,这些文件是这样的;
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
无需外壳循环或其他任何必要的命令。