0

我有 44 个文件(每个染色体 2 个)分为两种类型:.vcf 和 .filtered.vcf。我想wc -l 在一个循环中为它们中的每一个制作一个并将输出始终附加到同一个文件中。但是,我想在这个文件中有 3 列:chr[1-22] 、.vcfwc -lwc -l.filtered.vcf。

我一直在尝试wc -l对每个文件进行独立操作,并将每个染色体的 2 个输出按列粘贴在一起,但这显然不是很有效,因为我生成了很多不必要的文件。我正在为 22 对文件尝试此代码:

wc -l file1.vcf | cut -f 1 > out1.vcf
wc -l file1.filtered.vcf | cut -f 1 > out1.filtered.vcf
paste -d "\t" out1.vcf out1.filtered.vcf

我希望只有一个包含三列的输出文件:

Chromosome    VCFCount    FilteredVCFCount
chr1          out1        out1.filtered
chr2          out2        out2.filtered

任何帮助将不胜感激,非常感谢您提前:)

4

2 回答 2

0

也许试试这个。

for chr in chr*.vcf; do
    base=${chr%.vcf}
    awk -v base="$base" 'BEGIN { OFS="\t"
            # Remove this to not have this pesky header line
            print "Chromosome", "VCFCount", "FilteredVCFCount"
            }
        FNR==1 && n { p=n }
        { n=FNR }
        END { print base, p, n }' "$chr" "$base.filtered.vcf"
done >counts.txt

非常简单的 Awk 脚本只收集每个文件的最高行号(因此我们基本上重新实现wc -l)并以所需的格式打印收集到的数字。 FNR是当前输入文件中的行号;p当我们切换到新文件时(从第 1 行开始),我们只需保存它,并将值复制到以将前一个文件中保存的值保存在一个单独的变量中。

shell 参数替换在删除后${variable%pattern}检索variable任何后缀匹配的值。pattern(还有${variable#pattern}删除前缀,而 Bash 有##%%修剪最长的模式匹配而不是最短的。)

如果效率很重要,您可能可以将所有脚本重构为单个 Awk 脚本,但这样一来,所有部分都很简单并且希望可以理解。

于 2019-01-15T09:50:29.837 回答
0
printf "%s\n" *.filtered.vcf |
cut -d. -f1 |
sort |
xargs -n1 sh -c 'printf "%s\t%s\t%s\n" "$1" "$(wc -l <"${1}.vcf")" "$(wc -l <"${1}.filtered.vcf")"' -- 
  1. 输出目录中换行符分隔的文件列表
  2. 用 cut 删除扩展(可能xargs -i basename {} .filtered.vcf会更安全)
  3. 对它进行排序(以获得良好的排序输出!)(可能一些东西sort -tr -k2 -n会按数字排序并且会更好)。
  4. xargs -n1对于每个文件执行脚本sh -c
    1. printf "%s\t%s\t%s\n"- 使用自定义格式字符串输出...
    2. "$1"- 文件名和...
    3. "(wc -l <"${1}.vcf")"- 计算 .vcf 文件中的行数并...
    4. "$(wc -l <"${1}.filtered.vcf")"- .filtered.vcf 中的行数

例子:

> touch chr{1..3}{,.filtered}.vcf 
> echo > chr1.filtered.vcf ; echo  > chr2.vcf ; 
>     printf "%s\n" *.filtered.vcf |
>    cut -d. -f1 |
>    sort |
>    xargs -n1 sh -c 'printf "%s\t%s\t%s\n" "$1" "$(wc -l <"${1}.filtered.vcf")" "$(wc -l <"${1}.vcf")"' -- 
chr1    0   1
chr2    1   0
chr3    0   0

要获得带有标题的漂亮表格,请使用column

> .... | column -N Chromosome,VCFCount,FilteredVCFCount -t -o '    '
Chromosome    VCFCount    FilteredVCFCount
chr1          0           1
chr2          1           0
chr3          0           0
于 2019-01-15T09:44:42.060 回答