Imprimir líneas pares/impares en una nueva columna

Imprimir líneas pares/impares en una nueva columna

Tengo un archivo con X número de líneas en una sola columna y quiero imprimir cada línea par/impar en una nueva columna, ¿es esto posible en Linux o en vimel editor?

Por ejemplo:

Fichero de entrada:

RESOLUTION: 1.70
UNIT: MONOMERIC
RESOLUTION: 1.80
UNIT: DIMERIC
RESOLUTION: 2.50
UNIT: TRIMERIC
RESOLUTION: 2.20
UNIT: TETRAMERIC

Archivo de salida, que necesito:

RESOLUTION: 1.70    UNIT: MONOMERIC
RESOLUTION: 1.80    UNIT: DIMERIC
RESOLUTION: 2.50    UNIT: TRIMERIC
RESOLUTION: 2.20    UNIT: TETRAMERIC

Respuesta1

Pruebe a continuación.

$cat a.txt
RESOLUTION: 1.70
UNIT: MONOMERIC
RESOLUTION: 1.80
UNIT: DIMERIC
RESOLUTION: 2.50
UNIT: TRIMERIC
RESOLUTION: 2.20
UNIT: TETRAMERIC

$ cat a.txt | sed 'N;s/\n/ /g'
RESOLUTION: 1.70 UNIT: MONOMERIC
RESOLUTION: 1.80 UNIT: DIMERIC
RESOLUTION: 2.50 UNIT: TRIMERIC
RESOLUTION: 2.20 UNIT: TETRAMERIC

Respuesta2

Suponiendo que los datos están en el archivo z1, entonces

paste -sd "\t\n" z1

Producirá:

RESOLUTION: 1.70        UNIT: MONOMERIC
RESOLUTION: 1.80        UNIT: DIMERIC
RESOLUTION: 2.50        UNIT: TRIMERIC
RESOLUTION: 2.20        UNIT: TETRAMERIC

En un sistema como:

OS, ker|rel, machine: Linux, 3.16.0-7-amd64, x86_64
Distribution        : Debian 8.11 (jessie) 
bash GNU bash 4.3.30
paste (GNU coreutils) 8.23

Mis mejores deseos...salud, drl

Respuesta3

Estás buscando en el lugar correcto (awk o sed).

sedes suficiente, si se usa gnu sed.

verhttps://www.gnu.org/software/sed/manual/sed.html#Numeric-Addresses

4.2 Seleccionar líneas por números

primer~paso Esta extensión de GNU coincide con cada paso de línea comenzando con la primera línea. En particular, las líneas se seleccionarán cuando exista un n no negativo tal que el número de línea actual sea igual al primero + (n * paso). Por lo tanto, se usaría 1~2 para seleccionar las líneas impares y 0~2 para las líneas pares; para elegir cada tercera línea comenzando con la segunda, se usaría '2~3'; para seleccionar cada quinta línea empezando por la décima, utilice '10~5'; y '50~0' es sólo una forma oscura de decir 50.

Los siguientes comandos demuestran el uso de la dirección de paso:

$ secuencia 10 | sed -n '0~4p' 4 8

$ secuencia 10 | sed -n '1~3p' 1 4 7 10

Respuesta4

Si tiene un espacio al final de las líneas impares, puede escribir un edscript:

{ for((line=1; line <= $(wc -l < input) / 2; line++)); do printf '%d,%dj\n' "$line" "$((line + 1))"; done; echo "wq"; } | ed -s input

Reformateado:

{ for((line=1; line <= $(wc -l < input) / 2; line++))
  do 
    printf '%d,%dj\n' "$line" "$((line + 1))"
  done
  echo "wq"
} | ed -s input

La idea general es calcular el número de líneas, dividirlo por dos, los edcomandos de impresión que unirán las líneas pares y impares. Para su archivo de muestra de ocho líneas, el bucle produciría estos edcomandos:

1,2j
2,3j
3,4j
4,5j

El comando final echosimplemente indica edque escriba el archivo en el disco y salga.

Este método no agrega ningún espacio en blanco entre las líneas contiguas, por lo que si necesita agregar (digamos) una pestaña, deberá insertarla agregando esta línea antes de la existente printf:

        printf '%ds/$/  /\n' "$line"

donde el espacio en blanco que ve en el texto de reemplazo es una pestaña (ingréselo con Control-V, TAB).

información relacionada