将列表转换为bash中存在/不存在的表

时间:2017-03-24 17:01:58

标签: bash

我有以下列表:

gene1 file1
gene2 file2
gene3 file3

转为以下在场/缺席表

       gene1    gene2    gene3
file1  +        -        -
file2  -        +        -
file3  -        -        +

在bash中有什么方法可以做到吗?

1 个答案:

答案 0 :(得分:0)

假设存在一个不能存在于流派名称中的字符或字符串(下面,我使用__ - 双下划线),您可以使用关联数组来存储和执行分摊的O( 1)查找。

#!/bin/bash

input='gene1 file1
gene2 file2
gene3 file3'

declare -A known_files=( )
declare -A known_genres=( )
declare -A known_pairs=( )

while read -r genre file; do
  known_files[$file]=1
  known_genres[$genre]=1
  known_pairs[${genre}__${file}]=1
done <<<"$input"

# write header containing all known genres
printf '%s\t' '' "${!known_genres[@]}"; printf '\n'

# iterate through files, writing columns for each
for file in "${!known_files[@]}"; do
  printf '%s\t' "$file"
  for genre in "${!known_genres[@]}"; do
    if [[ ${known_pairs["${genre}__${file}"]} ]]; then
      printf '%s\t' "+"
    else
      printf '%s\t' "-"
    fi
  done
  printf '\n'
done

请注意,这需要bash 4.0或更高版本 - 如果您使用的是OS X(由于许可原因而发布了一个古老的版本),请考虑使用MacPorts或Homebrew安装现代版本。