2017-08-30 48 views
-2

我在一个目录中有几个文件,这些文件都是这样命名的;使用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 

感谢您的帮助!

编辑:拼写和vocabular为清楚起见

回答

0

尝试在单一AWK和下面也将被越来越文件数的护理在这个操作过程中也会打开,这样我们就可以避免打开文件的最大数量的错误。

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

我该如何执行此操作?这是否必须在同一目录中? – Tassanara

+0

@Tassanara:尝试在终端上运行,它只会打印行,如果需要输出到单个输出文件,那么您可以在最后一个命令处执行> output_file,让我知道它是如何进行的。 – RavinderSingh13

+1

工作就像一个魅力,非常感谢! – Tassanara

1

遍历文件与for,使用参数扩展来获取该ID。

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

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

+0

它给了我这个错误: 我输入:SH addId.sh :找不到命令 'ddId.sh:行3:附近意外的标记语法错误'做 ' ddId.sh:3号线:为' csv in * .csv;做 – Tassanara

+0

不要用'sh'来调用'bash'脚本。 – choroba

+0

我的不好,谢谢!我习惯于使用macOS,其中sh实际上调用bash而不是标准的bourne shell。活到老,学到老! – Tassanara

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 - 文件名
0

随着GNU AWK对就地编辑和gensub()所有你需要的是:

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

无壳环或其他任何需要的,只是命令。

相关问题