3

我正在使用一个 unix shell 脚本来构建基因组,然后创建系统发育。根据您使用的基因组组装器,最终输出(系统发育)可能会发生变化。我想比较使用各种基因组组装器的效果。我已经开发了一些指标来比较它们,但我需要帮助来组织它们,这样我才能运行有用的分析。我想将我的数据导入到列中的 excel 中。

这是我用来输出数据的脚本:

echo "Enter the size (Mb or Gb) of your data set:"
read SIZEOFDATASET
echo "The size of your data set is $SIZEOFDATASET"
echo "Size of Data Set:" >> metrics_file.txt 
echo $SIZEOFDATASET >> metrics_file.txt

echo "Enter the name of your assembler"
read NAMEOFASSEMBLER
echo "You are using $NAMEOFASSEMBLER as your assembler"
echo "Name of Assembler:" >> metrics_file.txt 
echo "$NAMEOFASSEMBLER" >> metrics_file.txt
echo "Time:" >> metrics_file.txt

目前的输出是这样的:

Size of Data Set:
387 Mb
Name of Assembler:
Velvet
Genome Size:
1745690
Time:

我希望它看起来像这样: 在此处输入图像描述

提前致谢!

4

2 回答 2

5
#!/bin/sh

in_file=in.txt      # Input file
params=3            # Parameters count
res_file=$(mktemp)  # Temporary file
sep=' '             # Separator character

# Print header
cnt=0
for i in $(cat $in_file | head -$((params*2))); do
    if [ $((cnt % 2)) -eq 0 ]; then
        echo $i
    fi
    cnt=$((cnt+1))
done | sed ":a;N;\$!ba;s/\n/$sep/g" >>$res_file

# Parse and print values
cnt=0
for i in $(cat $in_file); do
    # Print values, skip param names
    if [ $((cnt % 2)) -eq 1 ]; then
        echo -n $i >>$res_file
    fi

    if [ $(((cnt+1) % (params*2))) -eq 0 ]; then
        # Values line is finished, print newline
        echo >>$res_file
    elif [ $((cnt % 2)) -eq 1 ]; then
        # More values expected to be printed on this line
        echo -n "$sep" >>$res_file
    fi

    cnt=$((cnt+1))
done

# Make nice table format
cat $res_file | column -t
rm -f $res_file

解释

此脚本假定:

  • 输入文件称为“in.txt”(参见in_file变量)
  • 输入文件使用您在问题中描述的格式
  • 结果表应该有 3 列(见params变量)

大多数代码只是解析您的输入数据格式。实际的列格式是由column工具完成的。

如果要将此表导出到 excel,只需将sep变量更改为','并将结果输出保存到.csv文件。这个文件可以很容易地导入到 excel 应用程序中。

例子

输入文件:

Size
387
Name
Velvet
Time
13
Size
31415
Name
Minia
Time
18
Size
31337
Name
ABCDEF
Time
42

脚本输出:

Size   Name    Time
387    Velvet  13
31415  Minia   18
31337  ABCDEF  42
于 2015-02-27T00:21:17.843 回答
0

Sam 的回答正好提供了您正在寻找的内容,但您也可以考虑使其更加精简,避免将指标文件转换为表格的需要,然后立即写入表格。例如,编写一个像这样的脚本 user_input.bash:

echo "Enter the size (Mb or Gb) of your data set:" > /dev/stderr
read SIZEOFDATASET
echo "The size of your data set is $SIZEOFDATASET" > /dev/stderr
echo "Enter the name of your assembler" > /dev/stderr
read NAMEOFASSEMBLER
echo "You are using $NAMEOFASSEMBLER as your assembler" > /dev/stderr
echo "Enter Time:" > /dev/stderr
read TIME
echo "You entered Time:" $TIME > /dev/stderr
echo "Name Size Time"
echo $NAMEOFASSEMBLER $SIZEOFDATASET $TIME

使用程序:

 ./user_input.bash > metrics.file.1.txt
    ./user_input.bash > metrics.file.2.txt
    ./user_input.bash > metrics.file.3.txt
    ...

收集所有结果:

head -n 1  metrics.file.1.txt > allmetrics.txt
tail -n +2 -q metrics.file.*.txt > allmetrics.txt

高温高压

于 2015-02-27T15:30:47.957 回答