我在目录中有几个文件,名称如下;
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
感谢您的帮助!
编辑:清晰的拼写和词汇
答案 0 :(得分:1)
使用for
循环遍历文件,使用参数扩展来提取ID。
#!/bin/bash
for csv in *.csv ; do
prefix=${csv%_*}
id=${csv#*_}
id=${id%.csv}
sed -i~ "s/^/$id;/" "$csv"
done
如果ID可以包含下划线,则可能需要更加小心扩展。
答案 1 :(得分:1)
使用 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
- 文件名答案 2 :(得分:0)
在单个awk中也尝试关注,并且会处理在此操作期间打开的文件数量,这样我们就可以避免打开的最大文件数的错误。
awk 'FNR==1{close(val);val=FILENAME;split(FILENAME,a,"_");sub(/\..*/,"",a[2])} {print a[2]","$0}' *.csv
答案 3 :(得分:0)
使用GNU awk进行内部编辑和gensub(),您只需要:
awk -i inplace '{print gensub(/.*_(.*)\..*/,"\\1;",1,FILENAME) $0}' *.csv
没有shell循环或其他任何必要的东西,只是那个命令。