使用bash / sed

时间:2017-08-30 09:26:22

标签: bash csv sed

我在目录中有几个文件,名称如下;

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

感谢您的帮助!

编辑:清晰的拼写和词汇

4 个答案:

答案 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循环或其他任何必要的东西,只是那个命令。