Skip to content

Instantly share code, notes, and snippets.

@calexandre
Last active October 9, 2024 22:26
Show Gist options
  • Save calexandre/63547c8dd0e08bf693d298c503e20aab to your computer and use it in GitHub Desktop.
Save calexandre/63547c8dd0e08bf693d298c503e20aab to your computer and use it in GitHub Desktop.
Merge two zsh history files
#!/bin/bash
# Inspired on https://david-kerwick.github.io/2017-01-04-combining-zsh-history-files/
set -e
history1=$1
history2=$2
merged=$3
echo "Merging history files: $history1 + $history2"
test ! -f $history1 && echo "File $history1 not found" && exit 1
test ! -f $history2 && echo "File $history2 not found" && exit 1
cat $history1 $history2 | awk -v date="WILL_NOT_APPEAR$(date +"%s")" '{if (sub(/\\$/,date)) printf "%s", $0; else print $0}' | LC_ALL=C sort -u | awk -v date="WILL_NOT_APPEAR$(date +"%s")" '{gsub('date',"\\\n"); print $0}' > $merged
echo "Merged to: $merged"
@borekb
Copy link

borekb commented May 29, 2022

@NightMachinery This is great and works when I paste it to a terminal manually, however, it doesn't work for me when I create a script like merge-zhs-histories.sh. I tried this:

#!/usr/bin/env zsh

hist_file_1="/Users/borekb/.zsh_history"
hist_file_2="/Users/borekb/.zsh_history (1)"
hist_file_merged="/Users/borekb/.zsh_history-MERGED"

builtin fc -R -I "$hist_file_1"
builtin fc -R -I "$hist_file_2"

builtin fc -W "$hist_file_merged"

The .zsh_history-MERGED file is not created for me (but it is created when I copy/paste the code to my terminal).

Is that something specific about builtin fc? Or am I making some obvious mistake?

@martenson
Copy link

martenson commented Jun 3, 2022

@borekb I assume these only work in an interactive shell

edit: yep: https://zsh.sourceforge.io/Doc/Release/Shell-Builtin-Commands.html

@varenc
Copy link

varenc commented Sep 22, 2022

I tried the builtin fc method mentioned above but it doesn't sort the output! So in the resulting history you get all of one file first then all of the other file. Apparently zsh doesn't care that the timestamps are out of order and doesn't sort them. But the awk solution worked great for me!

@deeptshukla
Copy link

Thanks, I was getting error with merge_history.sh:
awk: towc: multibyte conversion failure on: '�`|:"' ()[]{}<>\t"'

builtin worked like a charm. Thanks

@kutsan
Copy link

kutsan commented Apr 3, 2024

Thank you!

@CapedBaldy99
Copy link

Thanks to both of u guys

@shixpGit
Copy link

shixpGit commented Jul 9, 2024

thank you, nice!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment