Aquí está el débil intento de un comando de pegar que intenta incluir una nueva línea:
paste -d -s tmp1 tmp2 \n tmp3 \n tmp4 tmp5 tmp6 > tmp7
Básicamente tengo varias líneas en cada tmp y quiero que se lea en el resultado
First(tmp1) Last(tmp2)
Address(tmp3)
City(tmp4) State(tmp5) Zip(tmp6)
¿Estoy muy equivocado al usar una nueva línea en el comando pegar?
Aquí está mi producto terminado: ¡GRACIAS POR LA AYUDA!
cp phbook phbookh2p5
sed 's/\t/,/g' phbookh2p5 > tmp
sort -k2 -t ',' -d tmp > tmp0
cut -d',' -f1,2 tmp0 > tmp1
cut -d',' -f3 tmp0 > tmp2
cut -d',' -f4,5,6 tmp0 > tmp3
echo "" > tmp4
paste -d '\n' tmp1 tmp2 tmp3 tmp4 > tmp7
sed 's/\t/ /g' tmp7 > phbookh2p5
cat phbookh2p5
rm tmp*; rm phbookh2p5
Respuesta1
Pruebe esta solución con dos archivos temporales adicionales:
paste tmp1 tmp2 > tmp12
paste tmp4 tmp5 tmp6 > tmp456
paste -d "\n" tmp12 tmp3 tmp456 > tmp7
Esta solución se basó en el supuesto de que la -d
opción selecciona el delimitadorglobalmentepara todos los archivos de entrada, por lo que debe estar en blancoouna nueva línea. En cierto modo, esto es cierto ya que en ocasiones posteriores -d
se sobrescriben las anteriores. Sin embargo, como señaló @DigitalTrauma, podemos proporcionar más de un delimitador que se usará secuencialmente. Entonces la solución de @DigitalTrauma es más elegante que la mía ya que evita por completo archivos temporales adicionales.
Una aplicación de nicho para mi solución sería el caso en el que uno o delimitadores conmás de un personaje cada unohay que utilizarlo. Esto no debería ser posible simplemente usando la -d
opción.
Respuesta2
Creo que esta parte de la paste
página de manual es lo que quieres:
-d, --delimiters=LIST reuse characters from LIST instead of TABs
Entonces, esta frase breve debería funcionar para su caso:
paste -d" \n\n " tmp1 tmp2 tmp3 tmp4 tmp5 tmp6 > tmp7
Funciona como se esperaba con los datos de muestra de @DopeGhoti:
$ grep . tmp*
tmp1:Bill
tmp1:Bob
tmp2:Kerman
tmp2:Germin
tmp3:123 Main St.
tmp3:321 Sesame St.
tmp4:Kerbopalis
tmp4:Kerbington
tmp5:Kerbskatchewan
tmp5:Kermont
tmp6:12345
tmp6:31416
$ paste -d" \n\n " tmp1 tmp2 tmp3 tmp4 tmp5 tmp6
Bill Kerman
123 Main St.
Kerbopalis Kerbskatchewan 12345
Bob Germin
321 Sesame St.
Kerbington Kermont 31416
$
Probé esto con éxito paste
desde GNU Coreutils 5.97 y 8.21 y BSD (OS X). No estoy seguro de qué otras versiones de pasta existen en el mercado.
Respuesta3
Este comando debería funcionar.
paste -s tmp1 tmp2 -d '\n' tmp3 -d '\n' tmp4 tmp5 tmp6 > tmp7
Respuesta4
sort -dk2,2 phpbook |
sed "s/\t/\n/3;s//\n/2;s// /g"
Según tengo entendido, tiene un archivo llamado phpbook
que consta de líneas de entradas de la guía telefónica que se ven así:
{first}\t{last}\t{address}\t{city}\t{state}\t{zip}
Desea ordenarlos {last}
, agregar nuevas líneas a continuación {last}
y, {address}
para cada entrada, traducir \t
abs a <spaces>
y luego imprimir los resultados en stdout
. Si ese no es el caso, entonces no puedo entender qué más haría su comando, pero a veces puedo ser bastante tonto.
Debes tener en cuenta que sort
delimita por <TAB>
caracteres de forma predeterminada así:
sed 's/\t/,/g' | sort ... -t ,
...probablemente no valga la pena hacerlo.
Pensar un poco más y supongo que es bastante probable que sus delimitadores estén mezclados y que el inicial sed
esté destinado a normalizarlos. Eso tiene sentido. Tal vez como:
1,2\t3\t4,5,6
...o algo. En ese caso es necesaria una traducción inicial de algún tipo. Así que tal vez...
tr , \\t <phbook | sort ... | sed ...
Funcionaría un poco mejor. También...
sort ... -k 2
...podríaser problemático en casos extremos porque cuando lo usas sort
nosoloel segundo campo, sino desde el segundo campo hasta el final de la línea. En general, cuando las personas hacen lo que realmente quieren, -k2,2
lo que limita los datos sort
que considerasoloel segundo campo.
También podría valer la pena agregar una clave secundaria como:
...sort -dk2,2 -k1,1
...Cuál deberíasort
ante todosobre apellidos ysecundariamenteen los nombres. De ese modoZed SmithseguiríanAlfa Smithcada vez.
De todos modos, en caso de que tenga razón, la sort | sed
tubería anterior debería hacer todo. Supongo que sed
entiendes los \e
paisajes que utilicé, pero si no es así, puedes intentar reemplazar el sed
script citado con:
s/<literal TAB>/\
/3;s//\
/2;s// /g