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 vim
el 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).
sed
es 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 ed
script:
{ 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 ed
comandos 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 ed
comandos:
1,2j
2,3j
3,4j
4,5j
El comando final echo
simplemente indica ed
que 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).