python - Linux/bash/awk 读取部分文件名作为变量

标签 python linux bash csv awk

我们编写了一个 awk one liner 将输入的 csv 文件 (Assay_51003_target_pairs.csv) 拆分为多个文件。对于任何行,如果它们的第 1 列等于另一列第 1 列,第 2 列等于另一个第 2 列,等等,这些行将被分类到一个新文件中。新文件将使用列值命名。

这是一个类轮

awk -F "," 'NF>1 && NR>1 && $1==$1 && $2==$2 && $9==$9 && $10==$10{print $0 >> ("Assay_"$1"_target_"$3"_assay_" $9 "_bcassay_" $10 "_bcalt_assay.csv");close("Assay_"$1"_target_"$3"_assay_" $9 "_bcassay_" $10 "_bcalt_assay.csv")}' Assay_51003_target_pairs.csv

这将生成以下示例输出 (Assay_$1_target_$3_assay_$9_bcassay_$10_bcalt_assay.csv):

Assay_51003_target_1645_assay_7777_bcassay_8888_bcalt_assay.csv

51003,666666,1645,11145,EC50,,0.2,uM,7777,8888,IC50,,1,uM,,3,2.0555,3011-02-0100:00:00,1911-04-1100:00:00,Cell,Biochemical
51003,666666,1645,1680,EC50,<,0.1,uM,7777,8888,IC50,,1,uM,,2,2.8579,3004-06-0300:00:00,3000-04-1100:00:00,Cell,Biochemical

Assay_51003_target_1645_assay_7777_bcassay_9999_bcalt_assay.csv

51003,666666,1645,11145,EC50,,0.2,uM,7777,9999,IC50,,1,uM,,3,2.0555,3011-02-0100:00:00,1911-04-1100:00:00,Cell,Biochemical
51003,666666,1645,1680,EC50,<,0.1,uM,7777,9999,IC50,,1,uM,,2,2.8579,3004-06-0300:00:00,3000-04-1100:00:00,Cell,Biochemical

Assay_51003_target_1688_assay_7777_bcassay_9999_bcalt_assay.csv

51003,666666,1688,11145,EC50,,0.2,uM,7777,9999,IC50,,1,uM,,3,2.0555,3011-02-0100:00:00,1911-04-1100:00:00,Cell,Biochemical
51003,666666,1688,1680,EC50,<,0.1,uM,7777,9999,IC50,,1,uM,,2,2.8579,3004-06-0300:00:00,3000-04-1100:00:00,Cell,Biochemical

稍后我们想做,例如,

awk -F, -f max_min.awk Assay_51003_target_1645_assay_7777_bcassay_8888_bcalt_assay.csv

awk -F, -f max_min.awk Assay_51003_target_1645_assay_7777_bcassay_9999_bcalt_assay.csv

awk -F, -f max_min.awk Assay_51003_target_1688_assay_7777_bcassay_9999_bcalt_assay.csv

#################################################

for b in 1645 1688

do

     for c in 8888 9999

     do

     awk -F, -f max_min.awk Assay_51003_target_$b_assay_7777_bcassay_$c_bcalt_assay.csv

     done

done  

但是,不知道有没有办法为后续的工作写一个循环,因为输出文件名是“随机的”。请问linux/bash有没有办法把部分文件名解析成循环变量(比如把1645和1688解析成b,把8888和9999解析成c)?

最佳答案

使用 Bash 应该非常容易,因为值总是数字:

shopt -s nullglob

FILES=(Assay_*_target_*_assay_*_bcassay_*_bcalt_assay.csv)  ## No need to do +([[:digit:]]). The difference is unlikely.
for FILE in "${FILES[@]}"; do
    IFS=_ read -a A <<< "$FILE"
    # Do something with ${A[1]} ${A[3]} ${A[5]} and ${A[7]}
    ...

    # Or

    IFS=_ read __ A __ B __ C __ D __ <<< "$FILE"
    # Do something with $A $B $C and $D
    ...
done

关于python - Linux/bash/awk 读取部分文件名作为变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24644238/

相关文章:

python - Django:如何正确处理自定义 form_valid() 的错误

python - PHP 开发人员如何开始使用 MAMP 和 Python?

python - 如何在另一个函数中关闭 tkinter 窗口?

python - Django GenericIPAddress 字段不验证输入

bash - EOFD 是什么意思?

linux - 剪切命令在 Linux 上不起作用

javascript - 使用 Unix 的 sed 将 csv 转换为 javascript 对象

linux - SGE 网格作业依赖

linux - 在 Headless Linux 上运行 Unity CLI 构建开源项目 - 许可证问题

c - 在 C 宏中执行算术运算