bash - 解析文件并使用一些字段作为变量,使用 header 作为 bash 中的名称

标签 bash sed while-loop separator fastq

<分区>

我有一个文件,第一行包含一系列字段,制表符分隔 ( \t )。我正在尝试遍历这些行并将某些字段用作程序的变量。到目前为止,我的代码如下:

    {
    A=$(head -1 id_table.txt)
read;
    while IFS='\t' read $A; 
    do
        echo 'downloading '$SRA_Sample_s
        echo $tissue_s
    #out_dir=`echo $tissue_s | sed 's/ /./g'` #Replacing spaces by dots
    #/soft/bio/sequence/sratoolkit-2.3.4-2/bin/fastq-dump.2.3.4 --split-3 --outdir $out_dir --ncbi_error_report $SRA_Sample_s 
    done 
    } <./id_table.txt

输出(错误):

downloading _s Inser

downloading  provided> <no

downloading  provided> <no

downloading  provided> <no

它失败了,因为它没有正确获取字段。也许 <>人物正在制造困惑?不同文件的列名称顺序不同,并且某些文件中缺少某些列。我被困在这里了。

文件看起来像这样:

BioSample_s MBases_l    MBytes_l    Run_s   SRA_Sample_s    Sample_Name_s   age_s   breed_s sex_s   Assay_Type_s    AssemblyName_s  BioProject_s    BioSampleModel_s    Center_Name_s   Consent_s   InsertSize_l    Library_Name_s  Platform_s  SRA_Study_s biomaterial_provider_s  g1k_analysis_group_s    g1k_pop_code_s  source_s    tissue_s
SAMN02777951    4698    3249    SRR1287653  SRS607026   SL01    19  SL01    female  RNA-Seq <not provided>  PRJNA247712 Model organism or animal    SICHUAN UNIVERSITY  public  200 <not provided>  ILLUMINA    SRP041998    Chengdu Research Base of Giant Panda Breeding  <not provided>  <not provided>  <not provided>  blood
SAMN02777952    4451    3063    SRR1287654  SRS607028   XB01    12  XB01    male    RNA-Seq <not provided>  PRJNA247712 Model organism or animal    SICHUAN UNIVERSITY  public  200 <not provided>  ILLUMINA    SRP041998    Chengdu Research Base of Giant Panda Breeding  <not provided>  <not provided>  <not provided>  blood
SAMN02777953    4553    3139    SRR1287655  SRS607025   XB02    6   XB02    female  RNA-Seq <not provided>  PRJNA247712 Model organism or animal    SICHUAN UNIVERSITY  public  200 <not provided>  ILLUMINA    SRP041998    Chengdu Research Base of Giant Panda Breeding  <not provided>  <not provided>  <not provided>  blood

最佳答案

IFS='\t' 没有按照您想要的方式工作。这是由 t 分隔的。使用 IFS=$'\t' 来使用制表符。

这就是您得到 _s Inser 等的原因(注意它在字母 t 处开始和终止)。

话虽这么说,但我完全同意 EdMorton 的观点,即为此使用 awk 可能是一个更好的主意,尽管我相信通过仔细引用并断言选项卡不会出现在输入文件中,您可能可以仅使用 shell 安全地执行此操作(但埃德不止一次向我展示了我最初想法的错误,所以他很可能在想我不是的事情)。

关于bash - 解析文件并使用一些字段作为变量,使用 header 作为 bash 中的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27227735/

相关文章:

bash - 如何将多个命令通过管道传输到 shell 中的单个命令? (嘘,庆典,...)

linux - 用于监视磁盘 IO 的 shell 脚本无法正常工作

Bash/sed 字符串替换为文件内容(包含换行符)

php - 在 PHP 中处理大型 while 循环的最佳方法

PHP If/Else 语句在 While 循环中不起作用

linux - 如何在避免 'Too many arguments' 的同时进行 grep

linux - 如何为 openvt 重定向 stderr

linux - 在后台运行命令并退出

csv - 将 block 中的行转换为制表符分隔

javascript - Three.js 为什么使用 for 循环而不是 while