【问题标题】:Print Filename and Substring to csv For Each File in a Directory,对于目录中的每个文件,将文件名和子字符串打印到 csv,
【发布时间】:2020-06-12 18:15:54
【问题描述】:

我一直在尝试自学 awk 以完成以下任务,但没有取得多大成功。

我有一个包含多个文本文件的目录:

JV-01_S01_L007_R2_002_RepetitiveText_ToRemove.txt
JV-26_S48_L_RepetitiveText_ToRemove.txt
...

每个文本文件的结构如下。 数字可能会改变,但随附的文字将始终保持不变。

JV-01_S01_L007_R2_002_RepetitiveText_ToRemove.txt

4620178 reads; of these:
  4620178 (100.00%) were unpaired; of these:
    1226814 (26.55%) aligned 0 times
    3040861 (65.82%) aligned exactly 1 time
    352503 (7.63%) aligned >1 times
73.45% overall alignment rate

JV-26_S48_L_RepetitiveText_ToRemove.txt

1601831 reads; of these:
  1601831 (100.00%) were unpaired; of these:
    58800 (3.67%) aligned 0 times
    1344724 (83.95%) aligned exactly 1 time
    198307 (12.38%) aligned >1 times
96.33% overall alignment rate

对于这个目录中的每个文件,我想编译一个csv:

Sample                  Total_Reads Uniquely_Mapped_Reads   Multi_Mapped_Reads  Unmapped_Reads
JV-01_S01_L007_R2_002   4620178     3040861                 352503              1226814
JV-26_S48_L             1601831     1344724                 198307              58800
...

有没有什么方法可以用一个带有 awk 的 for 循环来做到这一点?我试图使用匹配功能。 例如,如果我可以在特定行中指定匹配搜索,然后从左到右搜索由任意数量的数字组成的子字符串,直到找到空格。这将获取该行感兴趣的子字符串。

类似的东西:

for file in *.txt
do
  awk 'FNR == 1 {print FILENAME, match(NR==1, \d), match(NR==4, \d), match(NR==5, \d), match(NR==3, \d) } ' $file >> Names.csv

【问题讨论】:

    标签: for-loop awk cat


    【解决方案1】:

    这是一个简单的方法,但它需要 GNU awk 才能实现多字符 RS

    您可以使用技巧here 将文件作为单个记录读取。然后你只需要打印出你想要的字段(这取决于你断言文本是固定的)

    $ awk -v RS="^$" '{print FILENAME, $1, $16, $22, $11}' jv-01 jv-26
    jv-01 4620178 3040861 352503 1226814
    jv-26 1601831 1344724 198307 58800
    

    【讨论】:

    • 您应该提到,多字符 RS 需要 GNU awk。
    • 我使用的是 Mac OS,所以我对 gawk 并不乐观。但是,gawk 似乎是终端中的推荐命令。我是否应该在 Mac OS 上简单地将您的代码与“gawk -v ...”一起使用?不久前我确实安装了自制软件 - 也许 gawk 附带了?
    • 我还应该说,手动将“jv-01”和“jv-26”添加到脚本中并不理想 - 我需要运行数百个文件。
    【解决方案2】:

    您能否尝试使用所示示例进行以下、编写和测试。

    awk '
    BEGIN{
      print "Sample                  Total_Reads Uniquely_Mapped_Reads   Multi_Mapped_Reads  Unmapped_Reads"
    }
    FNR==1{
      if(total_reads){
        print file,total_reads,Uniquely_Mapped_Reads,times,Multi_Mapped_Reads,Unmapped_Reads
      }
      total_reads=Uniquely_Mapped_Reads=times=Multi_Mapped_Reads=Unmapped_Reads=""
      sub(/_RepetitiveText.*/,"",FILENAME)
      file=FILENAME
    }
    /reads; of these/{
      total_reads=$1
      next
    }
    /aligned exactly 1 time/{U
      niquely_Mapped_Reads=$1
      next
    }
    /aligned >1 times/{
      Multi_Mapped_Reads=$1
      next
    }
    /aligned [0-9]+ times/{
      Unmapped_Reads=$1
    }
    END{
      if(total_reads){
        print file,total_reads,Uniquely_Mapped_Reads,times,Multi_Mapped_Reads,Unmapped_Reads
      }
    }
    '  *.txt | column -t
    

    【讨论】:

    • @JVGen,这个解决方案应该适用于普通的 awk,也不需要它的任何特定版本。
    猜你喜欢
    • 2019-11-11
    • 1970-01-01
    • 2018-07-22
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2020-06-16
    • 1970-01-01
    • 2011-04-04
    相关资源
    最近更新 更多