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