How to align list to specific character?
At its simplest, you could just print the first field in a suitably large fieldwidth e.g.
awk -F@ 'BEGIN{OFS=FS} {$1 = sprintf("%12s", $1)} 1' file
[email protected]
[email protected]
[email protected]
AFAIK any method that does not assume a specific maximum fieldwidth will require either holding the file in memory or making two passes.
hacky solution, assumes a lot about input text
$ # four commas to reduce chance of it affecting actual email address
$ sed 's/@/,,,,@/' ip.txt | column -t -s,,,,
123 @example.com
456789 @example.net
01234 @something-else.com
$ sed 's/@/,,,,@/' ip.txt | column -t -s,,,, | sed -E 's/^([^ ]+)( +)/\2\1/'
[email protected]
[email protected]
[email protected]
A quick Python solution that uses the shortest possible padding length that right-aligns all strings left of the separator:
#!/usr/bin/env python3
import sys
fieldsep = '@'
records = [line.rstrip('\n').split(fieldsep, 1) for line in sys.stdin]
col1_len = max((len(r[0]) for r in records), default=0)
for r in records:
print(r[0].rjust(col1_len), r[1], sep=fieldsep)
Usage:
python3 align-field.py < data.txt