sort -dk2,2 phpbook |
sed "s/\t/\n/3;s//\n/2;s// /g"
Pelo que entendi, você tem um arquivo chamado phpbook que consiste em linhas de entradas de catálogo telefônico que se parecem com isso:
{first}\t{last}\t{address}\t{city}\t{state}\t{zip}
Você deseja classificá-las em {last} , adicionar novas linhas seguindo {last} e {address} para cada entrada, traduzir \t abs para <spaces> e depois imprimir os resultados em stdout . Se não for esse o caso, não sei o que mais o seu comando faria - mas às vezes posso ser bastante denso.
Você deve observar que sort delimita por <TAB> caracteres por padrão, portanto:
sed 's/\t/,/g' | sort ... -t ,
... provavelmente não vale a pena fazer.
Pensar é um pouco mais e suponho que seja muito provável que os seus delimitadores sejam mistos e que o sed inicial pretenda normalizá-los. Isso faz sentido. Talvez como:
1,2\t3\t4,5,6
... ou algo assim. Nesse caso, uma tradução inicial de algum tipo é necessária. Então talvez ...
tr , \t <phbook | sort ... | sed ...
trabalharia um pequeno bettet. Também ...
sort ... -k 2
... pode ser problemático em casos de borda porque quando você o usa, você não sort em somente o segundo campo, mas sim do segundo campo para o fim da linha. Em geral, quando as pessoas fazem isso, elas realmente querem -k2,2 , que confina os dados sort considera somente o segundo campo.
Também pode valer a pena adicionar uma chave secundária como:
...sort -dk2,2 -k1,1
... qual seria sort principalmente em sobrenomes e secundariamente em nomes próprios. Dessa forma, Zed Smith seguiria Alpha Smith todas as vezes.
De qualquer forma, se eu estiver certo, o sort | sed pipeline acima deve fazer a coisa toda. Estou assumindo que seu sed entende os \e scapes que usei, mas se isso não acontecer, você pode tentar substituir o script sed entre aspas por:
s/<literal TAB>/\
/3;s//\
/2;s// /g