A função a seguir usará apenas os Bash internos (caso você queira usar o Bash) para fazer o que quiser:
foo ()
{
local filename="$1"
while IFS='|' read -r pre name suf; do
l="$pre|${name#* },${name% *}|$suf";
printf '%s\n' "$l";
done < "$filename"
}
A variável IFS está definida como | e 'read' lê todas as linhas de cada vez de "$ 1" (seu arquivo) e divide em três partes, $ pre $ name e $ suf , de acordo com o valor do IFS.
$ pre valor é definido para ser o campo antes do nome, $ name é definido para ser o próprio nome que você deseja trocar (o segundo campo) e $ suf é o resto da linha.
Eu uso Expansão de Parâmetros (também pesquise Expansão de Parâmetros em man bash
) para dividir o campo $ name .
"${name#* }"
irá cortar o primeiro nome, deixando-nos com o sobrenome.
"${name% *}"
cortará o sobrenome, deixando-nos com o primeiro nome.
Uso: foo [/path/to/file.txt]
Exemplo de saída:
nylon100@~$ cat>file.txt
123|first1 last1|foo|bar|date|baz
456|first2 last2|foo|bar|date|baz
789|first3 last3|foo|bar|date|baz
nylon100@~$ foo file.txt
123|last1,first1|foo|bar|date|baz
456|last2,first2|foo|bar|date|baz
789|last3,first3|foo|bar|date|baz