用文件名shell脚本替换列名

时间:2017-06-08 06:41:36

标签: shell awk sed

如何将.csv文件中的第二列名称替换为目录中所有文件的相应文件名? 有谁知道如何使用shell脚本执行此操作? sed或awk

输入文件名CDXV1.csv

Gene,RPKM(26558640 pairs)
ENSTGUG00000013338 (GAPDH),971.678203888
ENSTGUG00000005054 (CAMKV),687.81249397
ENSTGUG00000006651 (ARPP19),634.296191033
ENSTGUG00000002582 (ITM2A),613.756010638

输出文件名CDXV1.csv(相同)

Gene,CDXV1(26558640 pairs)
ENSTGUG00000013338 (GAPDH),971.678203888
ENSTGUG00000005054 (CAMKV),687.81249397
ENSTGUG00000006651 (ARPP19),634.296191033
ENSTGUG00000002582 (ITM2A),613.756010638

2 个答案:

答案 0 :(得分:1)

awk -F, -v OFS=,  'NR==1{split(FILENAME,a,".");split($2,b,"(");$2= a[1] "(" b[2]}1' CDXV1.csv
Gene,CDXV1(26558640 pairs)
ENSTGUG00000013338 (GAPDH),971.678203888
ENSTGUG00000005054 (CAMKV),687.81249397
ENSTGUG00000006651 (ARPP19),634.296191033
ENSTGUG00000002582 (ITM2A),613.756010638

如果您的awk支持就地替换,请使用-i inplace

awk -i inplace -F, -v OFS=,  'NR==1{split(FILENAME,a,".");split($2,b,"(");$2= a[1] "(" b[2]}1' *.csv

答案 1 :(得分:1)

sed 解决方案:

for f in yourdir/*.csv; do sed -i "1s~^\([^,]*\),\([^(]*\)~\1,${f%%.*}~g" "$f"; done

详细

  • for f in yourdir/*.csv - 遍历 csv 文件名

  • -i - 就地修改文件

  • 1s - 仅在第一行执行替换

  • ~ - 用作 sed 子命令部分分隔符

  • ^\([^,]*\),\([^(]*\) - 捕获第一个字段和第二个字段值(直到遇到(

  • ${f%%.*} - bash变量替换,截断第一个.的右侧