【问题标题】:replace column name with file name shell script用文件名shell脚本替换列名
【发布时间】:2017-11-09 17:43:16
【问题描述】:

如何将 .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

【问题讨论】:

  • 您为自己尝试了什么?发布您的研究尝试,即使它们不成功

标签: shell awk sed


【解决方案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

【讨论】:

  • OP 需要将此应用于所有 .csv 文件,并且还需要以某种方式就地修改文件。
  • 感谢您提供的漂亮代码 PS,能否请您告诉我哪个版本的 awk 支持此功能,因为我有 gawk 4.0.1 但它没有此选项。
  • @RavinderSingh13 在最新的 GNU Awk(自 4.1.0 发布)中,它可以选择“就地”文件编辑检查以获取更多信息stackoverflow.com/questions/16529716/…
【解决方案2】:

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 变量替换,截断第一个.的右侧

【讨论】:

  • 成功了!谢谢!你介意解释一下命令吗?我只是进入这个东西。
  • @MadzaYasodaraFariasVirgens,是的,查看我的详细信息
猜你喜欢
  • 1970-01-01
  • 2020-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-06
  • 2017-11-09
相关资源
最近更新 更多