perl -lane '
next if $. == 1; # skip header
$A[@A] = $F[1] if /^1\h/; # populate new header
push @{$h{$F[0]}}, $F[2]}{$,="\t"; # OFS = tab
print q/SNP/, map { "Geno$_" } @A; # new header print
print $_, @{$h{$_}} for sort { $a <=> $b } keys %h; # result
' gene.data
Здесь сохраните 3-е поле $F[2]
в AoA (массив _массива _). В конце мы сортируем хэш-ключи в числовом виде и печатаем данные.
sed -e '
1d; # monospace lines
s/[[:blank:]]\{1,\}/\t/g;s/^[[:blank:]]*//;s/[[:blank:]]*$//
H;g
# 1 2 3 4
s/\(\n\(.*\n\)\{0,1\}\)1[[:blank:]]\([^[:space:]]\{1,\}\)\([[:blank:]][^[:space:]]\{1,\}\)$/\tGeno\3\1\n1\4/
/\(\n[^[:space:]]\{1,\}[[:blank:]]\)[^[:space:]]\{1,\}[[:blank:]]\([^[:space:]]\{1,\}\)$/s//\1\2/
y/\n_/_\n/
s/_\([0-9]\{1,\}\)\([^_]*\)_\(.*_\)\{0,1\}\1\([[:blank:]][^_]*\)/_\1\2\4_\3/
y/\n_/_\n/
h;$!d
s/\n*$//
s/\n\(\n\)/\1/
s/^[[:blank:]]/SNP&/
' gene.data
SNP Genoa Genob Genoc
1 AB AB AA
2 AB BB AB
3 BB AB AA
Можно установить PROMPT_COMMAND
для достижения этой цели следующим образом или множеством других способов.
export PROMPT_COMMAND='echo -e $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//")\\t$(date)\\t$(pwd) >> $HOME/history.csv'
Файл можно открыть как файл CSV с настраиваемым разделителем полей(TAB). Символ создается с помощью переключателя -e
на встроенную команду echo
, которая «включает [s] интерпретацию экранирования обратной косой черты».
$(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//")
:В Linux получить последнюю команду без номера команды и без пробела вокруг номера команды. $(date)
:Получить текущую дату и время. $(pwd)
:Получить текущий рабочий каталог. >> $HOME/history.csv
:Добавить(>>
)результат в файл. Это производит вывод, такой как следующая строка, если ls -la
были выполнены из$HOME
(изusername
).
ls -la Tue May 14 12:00:36 EDT 2019 /home/username