Intentando agregar una nueva línea al comando pegar

Intentando agregar una nueva línea al comando pegar

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 -dopció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 -dse 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 -dopción.

Respuesta2

Creo que esta parte de la pastepá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 pastedesde 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 phpbookque 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 \tabs 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 sortdelimita 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 sedesté 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 sortnosoloel 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,2lo que limita los datos sortque 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 | sedtubería anterior debería hacer todo. Supongo que sedentiendes los \epaisajes que utilicé, pero si no es así, puedes intentar reemplazar el sedscript citado con:

s/<literal TAB>/\
/3;s//\
/2;s// /g

información relacionada