首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于AWK中的变量创建csv文件

基于AWK中的变量创建csv文件
EN

Stack Overflow用户
提问于 2022-01-29 20:12:49
回答 2查看 101关注 0票数 -1

对于某些人来说,这看起来相对简单,但在我的例子中,我花了很多时间,但它不起作用。我想要做的是创建一个用逗号分隔的csv文件,使用提供的fastq_1 M1、fastq_2 M2和变量列表中fastq的名称作为信息。csv报头的名称应该如下所示:示例、fastq_1、fastq_2、搁浅以及每个变量和名称必须在标头的同一列中匹配。

代码语言:javascript
复制
fastq folder

S1_1.fastq.gz
S1_2.fastq.gz
S2_1.fastq.gz
S2_2.fastq.gz 
S3_1.fastq.gz
S3_2.fastq.gz
S4_1.fastq.gz
S4_2.fastq.gz

# variables
sample="mouse"
M1=$(ls *_1.fastq.gz)
M2=$(ls *_2.fastq.gz)
strandedness="paired"

#code
awk '
BEGIN      { OFS=",";
             print "sample", "fastq_1", "fastq_2", "strandedness"
           }
FNR==NR    {
             print $sample, $M1, $M2, $strandedness
           }' > output.csv

期望输出

代码语言:javascript
复制
sample, fastq_1, fastq_2, strandedness  #header
mouse, S1_1.fastq.gz, S1_2.fastq.gz, paired #values
mouse, S2_1.fastq.gz, S2_2.fastq.gz, paired #values
mouse, S3_1.fastq.gz, S3_2.fastq.gz, paired #values
mouse, S4_1.fastq.gz, S4_2.fastq.gz, paired #values

如果有人能帮我解决这个问题,我会很高兴的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-01-29 21:39:00

纯粹的bash可能比awk容易:

代码语言:javascript
复制
#!/bin/bash

sample=mouse
strandedness=paired
fastq_folder=./
{
    # header
    printf '%s, %s, %s, %s\n' sample fastq_1 fastq_2 strandedness

    # values
    for fastq_1 in "$fastq_folder"/*_1.fastq.gz
    do
        fastq_2="${fastq_1%_1.fastq.gz}_2.fastq.gz"

        [[ -f $fastq_2 ]] || continue # you may display an error message

        printf '%s, %s, %s, %s\n' \
            "$sample" \
            "${fastq_1##*/}" \
            "${fastq_2##*/}" \
            "$strandedness"
    done
} > output.csv

output.csv:

代码语言:javascript
复制
sample, fastq_1, fastq_2, strandedness
mouse, S1_1.fastq.gz, S1_2.fastq.gz, paired
mouse, S2_1.fastq.gz, S2_2.fastq.gz, paired
mouse, S3_1.fastq.gz, S3_2.fastq.gz, paired
mouse, S4_1.fastq.gz, S4_2.fastq.gz, paired

备注:在逗号后面添加空格可能更漂亮,但用CSV术语来说,这样做是在数据中添加一个空格字符。

票数 0
EN

Stack Overflow用户

发布于 2022-01-30 14:39:11

代码语言:javascript
复制
$ ls fastq_folder
S1_1.fastq.gz  S2_1.fastq.gz  S3_1.fastq.gz  S4_1.fastq.gz
S1_2.fastq.gz  S2_2.fastq.gz  S3_2.fastq.gz  S4_2.fastq.gz
代码语言:javascript
复制
$ cat tst.awk
BEGIN {
    OFS=","
    print "sample", "fastq_1", "fastq_2", "strandedness"
    for (i=1; i<ARGC; i++) {
        sub(".*/","",ARGV[i])
        file1 = file2 = ARGV[i]
        sub(/_1/,"_2",file2)
        print sample, file1, file2, strandedness
    }
    exit
}
代码语言:javascript
复制
$ awk -v sample="$sample" -v strandedness="$strandedness" -f tst.awk fastq_folder/*_1.fastq.gz
sample,fastq_1,fastq_2,strandedness
mouse,S1_1.fastq.gz,S1_2.fastq.gz,paired
mouse,S2_1.fastq.gz,S2_2.fastq.gz,paired
mouse,S3_1.fastq.gz,S3_2.fastq.gz,paired
mouse,S4_1.fastq.gz,S4_2.fastq.gz,paired

上面的假设是,文件总是成对的,就像您在评论中所说的那样,并且没有太多的文件超过shell的ARGS_MAX。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70909340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档