我有以下列表:
gene1 file1
gene2 file2
gene3 file3
转为以下在场/缺席表
gene1 gene2 gene3
file1 + - -
file2 - + -
file3 - - +
在bash中有什么方法可以做到吗?
答案 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安装现代版本。